使用 statsmodels 程式碼

Github

statsmodels 的程式碼庫託管於 Github。若要貢獻程式碼,您需要註冊一個免費的 Github 帳戶

版本控制與 Git

我們使用 Git 版本控制系統進行開發。Git 允許許多人同時在同一個專案上工作。簡而言之,它允許您獨立於其他可能也在開發程式碼的人員對程式碼進行變更,並讓您可以輕鬆地將變更貢獻到程式碼庫中。它也會保留所有程式碼變更的完整歷史記錄,因此您可以輕鬆地復原變更,或查看變更的時間、人員和原因。

要安裝和設定 Git,以及設定 SSH 金鑰,請參閱設定 Git

若要了解更多關於 Git 的資訊,您可以瀏覽:

下面,我們描述您貢獻到 statsmodels 所需的最基本 Git 命令。

statsmodels Git/Github 工作流程

Forking 和 Cloning

設定好 Git 後,您需要 fork 主 statsmodels 儲存庫。要做到這一點,請瀏覽statsmodels 專案頁面並點擊 fork 按鈕 (有關詳細資訊,請參閱fork a repo 的說明)。這應該會將您帶到您的 fork 頁面。

然後,您需要將 fork clone 到您的機器

git clone https://github.com/your-user-name/statsmodels
cd statsmodels
git remote add upstream https://github.com/statsmodels/statsmodels
git fetch --all

第三行設定與上游 statsmodels 儲存庫的唯讀連線。這將允許您定期使用上游的變更更新您的本地程式碼。最後一個命令會擷取您的儲存庫和上游的 statsmodels 儲存庫。

建立分支

對程式碼的所有變更都應該在功能分支中進行。若要建立分支,請輸入

git checkout main
git rebase upstream/main
git checkout -b shiny-new-feature

前兩行確保您從上游 statsmodels 儲存庫的最新版本開始。第三行建立並 checkout 一個新的分支。

執行

git branch

會得到類似

* shiny-new-feature
  main

的結果,表示您現在位於 shiny-new-feature 分支上。

進行變更

盡情發揮!進行您想要的任何變更,但請將您在分支中的工作完全限制在一個特定的主題、錯誤修復或功能實作中。您可以跨多個檔案工作並進行多次 commit,但變更都應該與功能分支的功能相關,無論該功能是什麼。

現在假設您變更了檔案 foo.py。您可以透過輸入以下內容來查看您的變更:

git status

這將列印類似以下的內容:

# On branch shiny-new-feature
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   relative/path/to/foo.py
#
no changes added to commit (use "git add" and/or "git commit -a")

在您 commit 這些變更之前,您必須 addstage 這些變更。您可以透過輸入以下內容來執行此操作:

git add path/to/foo.py

然後檢查狀態以確保您的 commit 看起來沒問題

git status

應該會得到類似以下的結果

# On branch shiny-new-feature
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   /relative/path/to/foo.py
#

推送您的變更

您可以隨時透過以下方式將您的功能分支 (和任何變更) 推送到您的 github (fork) 儲存庫:

git push

儘管第一次您需要執行

git push –set-upstream origin shiny-new-feature

以指示 git 將目前分支設定為追蹤其在您的 github 儲存庫中的對應分支。

您可以使用以下命令查看遠端儲存庫:

git remote -v

如果您如上所述新增了上游儲存庫,您將會看到類似以下的內容:

origin  https://github.com/yourname/statsmodels.git (fetch)
origin  https://github.com/yourname/statsmodels.git (push)
upstream        https://github.com/statsmodels/statsmodels.git (fetch)
upstream        https://github.com/statsmodels/statsmodels.git (push)

然而,在您推送任何 commit 之前,強烈建議您確保您推送的內容合理且看起來整潔。您可以透過以下方式檢閱您的變更歷史記錄:

git log --oneline --graph

在您將內容推送到 github 之前,在本地處理好一切是值得的。因此,如果心存疑慮,請不要推送。另請參閱關於在合併 vs. 變基 (Rebasing)中保持歷史記錄整潔的建議。

Pull Requests (提取請求)

當您準備好請求程式碼審查時,我們建議您提交提取請求。在您執行此操作之前,您應該自行檢查您的變更集。您可以使用 Github 上的compare view 來執行此操作。

  1. 導覽至您在 Github 上的儲存庫。

  2. 點擊 Branch List

  3. 點擊您的功能分支 shiny-new-featureCompare 按鈕。

  4. 如果需要,請選取 basecompare 分支。這將分別是 mainshiny-new-feature

  5. 在這裡您將看到您的變更的完整概觀。如果出現任何問題,您可以修正它。

如果一切看起來都不錯,您就可以提出提取請求了。

  1. 導覽至您在 Github 上的儲存庫。

  2. 點擊 Pull Request 按鈕。

  3. 然後,您可以點擊 CommitsFiles Changed 以確保最後一切看起來沒問題。

  4. Preview Discussion 標籤中寫下您的變更描述。

  5. 點擊 Send Pull Request

然後將審查您的請求。如果您需要返回並進行更多變更,您可以在您的分支中進行變更並將其推送到 github,而提取請求將自動更新。

最後要注意一件事。如果自您開始修補程式以來,upstream/main 中已進行大量工作,您可能需要變基 (rebase)。但是,如果這些變更與您在 shiny-new-feature 分支中所做的工作無關,您可能可以不進行變基。如果可以避免,請不要變基。如果您必須進行變基,請嘗試在您變更結束時執行一次。請繼續閱讀有關合併 vs. 變基 (Rebasing)的一些注意事項。

進階主題

合併 vs. 變基 (Rebasing)

這個主題已經被詳細討論過,並且比我們在此處可以提供的專業知識還要多。本節將提供一些資源供進一步閱讀和一些建議。但是,重點將放在那些希望為功能分支提交提取請求的人員身上。對於這些情況,應該優先選擇變基。

變基會將一個分支的 commit 重播到另一個分支之上,以保留線性歷史記錄。回想一下,您的 commit 是針對您啟動分支時 (可能) 較舊的 main 版本進行測試的,因此如果您變基,可能會引入錯誤。但是,如果您只有少數幾個 commit,這可能不是什麼大問題。要開始學習變基的一個好地方是無痛變基。特別是,請注意警告。也就是說,在執行變基之前,務必建立一個新分支。這是使用 git 的一般性好建議。我還要補充一點:絕對不要對已經發布的工作使用變基。如果其他開發人員正在使用您的工作,請不要變基!

至於合併,絕對不要將 trunk 合併到您的功能分支中。但是,您會希望檢查您的工作是否可以順利合併到 trunk 中。這將有助於審查人員。您可以在您的本地儲存庫中,將您的工作合併到您的 main 分支 (或任何追蹤遠端 main 分支的分支) 中,並執行執行測試

刪除分支

一旦您的功能分支被接受到上游,您可能想要將其刪除。首先,您需要將上游 main 合併到您的分支中。這樣,git 會知道它可以安全地刪除您的分支

git fetch upstream
git checkout main
git merge upstream/main

然後,您可以直接執行

git branch -d shiny-new-feature

請務必使用小寫 -d。這樣,如果您的功能分支實際上尚未合併,git 將會抱怨。不過,該分支仍然會存在於 github 上。若要刪除 github 上的分支,請執行

git push origin :shiny-new-feature branch

上次更新時間:2024 年 10 月 03 日