目錄

名稱

perlgit - 關於 git 與 Perl 儲存庫的詳細資訊

描述

本文件提供有關使用 git 開發 Perl 的詳細資訊。如果您只是想快速提交補丁,請先參閱 perlhack。本文件適用於定期向 Perl 做出貢獻的人,包括那些對 git 儲存庫具有寫入許可權的人。

克隆儲存庫

Perl 的所有原始程式碼都集中保存在 github.com 的 Git 儲存庫中。

您可以執行以下命令來進行儲存庫的唯讀克隆

% git clone git@github.com:Perl/perl5.git perl

如果因防火牆原因無法使用上述方法,您也可以通過 http 進行克隆

% git clone https://github.com/Perl/perl5.git perl

使用儲存庫

一旦您切換到儲存庫目錄,您可以對其進行檢查。克隆後,儲存庫將包含一個本地分支,該分支將是當前分支,並帶有星號標記。

% git branch
* blead

使用 -a 開關來 branch 也會顯示存儲庫中的遠程跟蹤分支

% git branch -a
* blead
  origin/HEAD
  origin/blead
...

以 "origin" 開頭的分支對應於您從中克隆的 "git remote"(名為 "origin")。每個遠程的分支都將被這些分支精確地跟蹤。您絕對不應在這些遠程跟蹤分支上進行工作。您只能在本地分支上進行工作。本地分支可以配置為自動從指定的遠程跟蹤分支合併(在拉取時)。這就是默認分支 blead 的情況,它將配置為從遠程跟蹤分支 origin/blead 合併。

您可以查看最近的提交

% git log

並從存儲庫拉取新更改,更新您的本地存儲庫(必須首先保持乾淨)

% git pull

假設我們在拉取後立即處於分支 blead,此命令大致上等同於

% git fetch
% git merge origin/blead

事實上,如果您想要更新您的本地存儲庫而不觸及您的工作目錄,您可以執行

% git fetch

如果您想要同時更新所有已定義的遠程的遠程跟蹤分支,您可以執行

% git remote update

這兩個最後兩個命令都不會更新您的工作目錄,但都會更新存儲庫中的遠程跟蹤分支。

創建遠程分支的本地分支

% git checkout -b maint-5.10 origin/maint-5.10

切換回 blead

% git checkout blead

查詢您的狀態

您可能會使用的最常見的 git 命令可能是

% git status

此命令將輸出存儲庫的當前狀態描述,包括已修改的文件和未忽略的未跟蹤文件,此外,它還會顯示已為下一次提交預備的文件,通常還會顯示一些有關如何更改的有用信息。例如,下面的

% git status
On branch blead
Your branch is ahead of 'origin/blead' by 1 commit.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

      modified:   pod/perlgit.pod

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:   pod/perlgit.pod

Untracked files:
  (use "git add <file>..." to include in what will be committed)

      deliberate.untracked

顯示了此文件已經準備提交的更改,以及工作目錄中尚未準備好的進一步更改。它還顯示了工作目錄中的一個未跟蹤文件,並且您可以看到如何更改所有這些內容。它還顯示了工作分支 blead 上有一次提交,該提交尚未推送到 origin 遠程。注意:如果未向 git commit 提供消息,則此輸出也是您看到的模板。

補丁工作流程

首先,請閱讀 perlhack 以了解有關修改 Perl 核心的詳細信息。該文件涵蓋了有關如何創建良好補丁的許多細節。

如果您已經有一個 Perl 存儲庫,您應該確保您在 blead 分支上,並且您的存儲庫是最新的

% git checkout blead
% git pull

最好對最新的 blead 版本進行補丁,因為這是除了關鍵錯誤修復之外的所有變更的新開發位置。關鍵錯誤修復補丁應該針對相應的 maint 分支進行補丁,或者應該附帶一個註釋,指示應將修復應用到的所有分支。

現在,我們已經將一切都更新到最新狀態,我們需要為這些更改創建一個臨時的新分支並切換到它

% git checkout -b orange

這是的簡寫形式

% git branch orange
% git checkout orange

創建一個專題分支使維護人員更容易將其重新基於主要 blead 分支進行合併,以實現更線性的歷史。如果您不在專題分支上工作,維護人員必須手動將您的更改選擇到 blead 上,然後才能應用。

這樣會被 perl5-porters 譴責,所以不要這樣做。做得更好。

然後進行您的更改。例如,如果Leon Brocard 將他的名字改為 Orange Brocard,我們應該在 AUTHORS 檔案中更改他的名字

% perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS

您可以查看哪些檔案已更改

% git status
On branch orange
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

   modified:   AUTHORS

您可以查看更改

% git diff
diff --git a/AUTHORS b/AUTHORS
index 293dd70..722c93e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -541,7 +541,7 @@    Lars Hecking              <lhecking@nmrc.ucc.ie>
 Laszlo Molnar                  <laszlo.molnar@eth.ericsson.se>
 Leif Huhn                      <leif@hale.dkstat.com>
 Len Johnson                    <lenjay@ibm.net>
-Leon Brocard                   <acme@astray.com>
+Orange Brocard                 <acme@astray.com>
 Les Peters                     <lpeters@aol.net>
 Lesley Binks                   <lesley.binks@gmail.com>
 Lincoln D. Stein               <lstein@cshl.org>

現在在本地提交您的更改

% git commit -a -m 'Rename Leon Brocard to Orange Brocard'
Created commit 6196c1d: Rename Leon Brocard to Orange Brocard
 1 files changed, 1 insertions(+), 1 deletions(-)

使用 -a 選項可包含您已更改的 git 追蹤的所有檔案。如果此時,您只想提交您已經工作過的部分檔案,您可以省略 -a,並在提交前使用指令 git add FILE ...git add --interactive 允許您只提交檔案的部分而不是其中的所有更改。

使用 -m 選項可指定提交訊息。如果您省略它,git 將為您打開一個文本編輯器,讓您進行互動式訊息撰寫。這在更改比這裡給出的範例更複雜時很有用,並且,根據編輯器的不同,要知道提交訊息的第一行不超過 50 個字符的合法最大值。有關什麼構成良好提交訊息的更多信息,請參見 perlhack 中的「提交訊息」

完成撰寫提交訊息並退出編輯器後,git 將您的更改寫入磁盤並向您顯示類似於此的訊息

Created commit daf8e63: explain git status and stuff about remotes
 1 files changed, 83 insertions(+), 3 deletions(-)

如果重新執行 git status,您應該看到類似於此的內容

% git status
On branch orange
Untracked files:
  (use "git add <file>..." to include in what will be committed)

      deliberate.untracked

nothing added to commit but untracked files present (use "git add" to
                                                                 track)

懷疑時,在您進行其他操作之前,檢查您的狀態並仔細閱讀它,很多問題都可以直接通過 git status 的輸出找到答案。

您可以使用以下指令檢查您的上一次提交

% git show HEAD

如果您對描述或补丁本身不滿意,您可以再次編輯文件並發出以下指令進行修復

% git commit -a --amend

現在,在 GitHub 上創建一個分支來推送,如果您還沒有,將其添加為遠端分支,如 GitHub 文檔中所述 https://help.github.com/en/articles/working-with-forks

% git remote add fork git@github.com:MyUser/perl5.git

並將分支推送到您的 fork

% git push -u fork orange

您現在應該在 GitHub 上從新分支到 blead 提交一個 Pull Request(PR)。更多信息,請參見 GitHub 文檔中的 https://help.github.com/en/articles/creating-a-pull-request-from-a-fork

如果补丁尚未準備好應用,但是用於討論,您也可以直接將补丁文件發送到 perl5-porters@perl.org

要創建所有本地更改的补丁文件

% git format-patch -M blead..
0001-Rename-Leon-Brocard-to-Orange-Brocard.patch

或者對於很多更改,例如從一個主題分支

% git format-patch --stdout -M blead.. > topic-branch-changes.patch

如果您想要刪除您的臨時分支,可以使用以下指令

% git checkout blead
% git branch -d orange
error: The branch 'orange' is not an ancestor of your current HEAD.
If you are sure you want to delete it, run 'git branch -D orange'.
% git branch -D orange
Deleted branch orange.

關於衍生檔案的注意事項

請注意,分發中的許多檔案都是衍生的—請避免對它們進行補丁,因為 git 不會看到對它們的更改,而建置過程將會覆寫它們。請改補丁原始檔案。大多數實用程式(例如 perldoc)都屬於此類,即補丁 utils/perldoc.PL 而不是 utils/perldoc。同樣地,請勿從位於 $install_root/lib 中的副本為 $src_root/ext 下的檔案製作補丁。如果您對於某個檔案的正確位置感到不確定,而該檔案可能在建置源分發時被複製,請查閱 MANIFEST

清理工作目錄

命令 git clean 可以使用不同的參數作為 make clean 的替代品。

要將您的工作目錄重置為原始狀態,可以執行以下命令

% git clean -dxf

但是,請注意,這將刪除所有未跟踪的內容。您可以使用

% git clean -Xf

來刪除所有被忽略的未跟踪檔案,例如建置和測試產物,但保留任何手動創建的檔案。

如果您只想取消某些未提交的編輯,您可以使用 git checkout 並給予一個要還原的檔案列表,或使用 git checkout -f 將它們全部還原。

如果您想取消一個或多個提交,可以使用 git reset

二分法

git 提供了一種內置的方法來確定哪個提交引入了特定的錯誤。 git bisect 通過對歷史進行二分搜索來定位第一個失敗的提交。它快速、強大且靈活,但需要一些設置,要自動化這個過程,需要一個輔助的 shell 腳本。

核心提供了一個包裝程式,Porting/bisect.pl,它試圖盡可能簡化,使二分法變得像運行 Perl 單行程式一樣簡單。例如,如果您想知道何時出現錯誤

perl -e 'my $a := 2'

您只需運行此命令

.../Porting/bisect.pl -e 'my $a := 2;'

使用 Porting/bisect.pl,只需一個命令(而無需其他檔案)就可以輕鬆找出

通常不需要知道要使用哪些版本的 perl 作為開始和結束修訂版本,因為 Porting/bisect.pl 會自動搜索以找到最早的穩定版本,其中測試案例通過。執行 Porting/bisect.pl --help 可以獲得完整的文件,包括如何設置 Configure 和建置時選項。

如果您需要比 Porting/bisect.pl 提供的彈性更大,您需要自己運行 git bisect。最有用的是使用 git bisect run 自動建置和測試 perl 修訂版本。為此,您需要一個 shell 腳本供 git 調用以測試特定的修訂版本。一個示例腳本是 Porting/bisect-example.sh,您應該將其複製到倉庫之外,因為二分法過程將會重置狀態為乾淨的檢查,當它運行時。下面的說明假設您將其複製到 ~/run,然後根據需要進行編輯。

您首先進入二分模式

% git bisect start

例如,如果錯誤出現在 HEAD 上但在 5.10.0 版本中不存在,當您輸入以下指令時,git 會了解到這一點

% git bisect bad
% git bisect good perl-5.10.0
Bisecting: 853 revisions left to test after this

這將導致檢出介於 HEADperl-5.10.0 之間的中位點提交。然後您可以運行以下指令進行二分搜索

% git bisect run ~/run

當找到第一個錯誤提交時,git bisect 會告訴您

ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5 is first bad commit
commit ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5
Author: Dave Mitchell <davem@fdisolutions.com>
Date:   Sat Feb 9 14:56:23 2008 +0000

    [perl #49472] Attributes + Unknown Error
    ...

bisect run success

您可以使用 git bisect loggit bisect visualize 查看二分搜索過程。使用 git bisect reset 可以退出二分模式。

請注意,第一個 good 狀態必須是第一個 bad 狀態的祖先。如果要搜索解決某個錯誤的提交,則必須對測試案例取反(即如果正確則退出並返回 1,否則返回 0),並將下限標記為 good,上限標記為 bad。 "第一個錯誤提交" 現在應理解為 "錯誤已經解決的第一個提交"。

git help bisect 提供了更多有關如何調整二分搜索的信息。

在完成二分搜索後,您可能希望在由二分搜索過程識別的提交中配置、構建和測試 perl。有時,特別是對於舊版本的 perl,make 在此過程中可能會失敗。在這種情況下,您可以在舊的提交點上修補源代碼。要這樣做,請按照 "在舊的提交中構建 perl" 中提供的建議

主題分支和重寫歷史

個別提交者應在 您的名稱/一些描述性名稱 下創建主題分支。

% branch="$yourname/$some_descriptive_name"
% git checkout -b $branch
... do local edits, commits etc ...
% git push origin -u $branch

如果您使用的是古老版本的 git(1.7 之前),則 git push 將沒有 -u 選項,您必須使用以下序列替換最後一個步驟

% git push origin $branch:refs/heads/$branch
% git config branch.$branch.remote origin
% git config branch.$branch.merge refs/heads/$branch

如果您想要更改其他人的主題分支,應在更改之前與其創建者核實。

有時您可能會發現原始作者已編輯了分支的歷史。這有很多好理由。有時,作者可能只是將分支重新定位到更新的源點。有時,作者可能在合併分支到 blead 前找到了早期提交中的錯誤,他們希望在合併之前修復。

目前主存儲庫配置為禁止非快進合併。這意味著內部的分支無法被重寫並作為單一步驟推送。

若要允許重新定位或修改已推送分支的歷史記錄,唯一的方法是刪除它,並將其作為同名新分支推送。請慎重考慮此操作。也許將分支逐個重新命名,以便其他與您合作的人更容易將其本地更改挑選到新版本上會更好(XXX:需要解釋)。

如果您想要重新定位個人主題分支,您將不得不刪除您現有的主題分支,並將其推送為新版本。在重新定位分支後,您可以通過以下公式執行此操作(有關refspec的詳細說明,請參閱git推送文檔中的解釋)

# first rebase
% git checkout $user/$topic
% git fetch
% git rebase origin/blead

# then "delete-and-push"
% git push origin :$user/$topic
% git push origin $user/$topic

注意: 在存儲庫級別上禁止刪除任何“主要”分支。即與m!^(blead|maint|perl)!匹配的任何分支。任何嘗試這樣做都將導致git生成像這樣的錯誤

% git push origin :blead
*** It is forbidden to delete blead/maint branches in this repository
error: hooks/update exited with error code 1
error: hook declined to update refs/heads/blead
To ssh://perl5.git.perl.org/perl
 ! [remote rejected] blead (hook declined)
 error: failed to push some refs to 'ssh://perl5.git.perl.org/perl'

根據政策,我們編輯blead和maint-*分支的歷史記錄。如果在提交到blead或maint-*時出現錯字(或更糟),我們將在另一個提交中進行修正。這些分支上允許的唯一類型的更新是“快進”,其中保留了所有歷史記錄。

在官方perl.git存儲庫中的帶有註釋的標籤將永遠不會被刪除或修改。在進行此操作之前,請仔細考慮是否要將本地標籤推送到perl.git(不允許推送簡單標籤)

嫁接

perl歷史記錄包含一個在轉換中未被發現的錯誤:在blead和maint-5.10之間的歷史記錄中記錄了一個合併,但實際上並沒有發生合併。由於git的性質,這現在無法在公共存儲庫中修復。您可以通過將以下行添加到您的.git/info/grafts文件中,本地刪除此錯誤合併

296f12bbbbaa06de9be9d09d3dcf8f4528898a49 434946e0cb7a32589ed92d18008aaa1d88515930

如果在問題合併區域進行了任何二分查找,則擁有此嫁接行尤其重要。

寫入git存儲庫的訪問權限

一旦獲得寫入訪問權限,您將需要修改原始遠程的URL以啟用推送。使用git-config(1)命令編輯.git/config

% git config remote.origin.url git@github.com:Perl/perl5.git

您還可以設置您的用戶名和電子郵件地址。大多數人通常在全局設定中執行一次,將其配置在~/.gitconfig中,例如

% git config --global user.name "Ævar Arnfjörð Bjarmason"
% git config --global user.email avarab@gmail.com

但是,如果您想為perl單獨覆蓋它,則在perl中執行以下操作

% git config user.email avar@cpan.org

還可以將origin保留為git遠程,並添加一個新的遠程進行ssh訪問

% git remote add camel git@github.com:Perl/perl5.git

這允許您通過從origin拉取來更新本地存儲庫,這樣做更快,不需要您進行身份驗證,並將您的更改推回到camel遠程

% git fetch camel
% git push camel

fetch命令僅更新camel引用,因為對象本身應該在從origin拉取時已被提取。

使用Github拉取請求進行工作

拉取請求通常來自Perl/perl.git存儲庫之外,因此如果您想要在本地測試或使用它,則從Perl/perl5.git存儲庫進行普通git fetch將不會拉取它。

但是,Github確實提供了一種機制來將拉取請求拉取到本地分支。它們在Github遠程下可用,位於pull/下,因此您可以使用git fetch pull/PRID/head:localname來製作一份本地副本。例如,要將拉取請求9999拉取到本地分支

git fetch origin pull/9999/head:local-branch-name

然後

git checkout local-branch-name

注意:此分支未在blead上進行重置基底,因此您可能需要執行上述檢查之外的操作

git rebase origin/blead local-branch-name

這會將local-branch-nameblead上進行重置基底,並檢出它。

或者,您可以配置遠端以將所有拉取請求作為遠端跟踪分支進行提取。要執行此操作,請編輯.git/config中的遠端配置,例如,如果您的 GitHub 遠端是origin,則應為

[remote "origin"]
        url = git@github.com:/Perl/perl5.git
        fetch = +refs/heads/*:refs/remotes/origin/*

添加一行以將遠端拉取請求分支映射為遠端跟踪分支

[remote "origin"]
        url = git@github.com:/Perl/perl5.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pull/*

然後按正常進行提取

git fetch origin

這將為每個拉取請求創建一個遠端跟踪分支,包括已關閉的請求。

要刪除這些遠端跟踪分支,請刪除上面添加的行並進行修剪

git fetch -p origin # or git remote prune origin

接受補丁

如果您收到使用上述部分生成的補丁文件,應試用該補丁。

首先,我們需要為這些更改創建一個臨時的新分支並切換到它

% git checkout -b experimental

使用git format-patch格式化的補丁使用git am應用

% git am 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
Applying Rename Leon Brocard to Orange Brocard

請注意,一些UNIX郵件系統可能會損壞包含'From '的文本附件。這將修復它們

% perl -pi -e's/^>From /From /' \
                       0001-Rename-Leon-Brocard-to-Orange-Brocard.patch

如果只提供了一個原始差異,也可以使用此兩步驟過程

% git apply bugfix.diff
% git commit -a -m "Some fixing" \
                           --author="That Guy <that.guy@internets.com>"

現在我們可以檢查變更

% git show HEAD
commit b1b3dab48344cff6de4087efca3dbd63548ab5e2
Author: Leon Brocard <acme@astray.com>
Date:   Fri Dec 19 17:02:59 2008 +0000

  Rename Leon Brocard to Orange Brocard

diff --git a/AUTHORS b/AUTHORS
index 293dd70..722c93e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -541,7 +541,7 @@ Lars Hecking                 <lhecking@nmrc.ucc.ie>
 Laszlo Molnar                  <laszlo.molnar@eth.ericsson.se>
 Leif Huhn                      <leif@hale.dkstat.com>
 Len Johnson                    <lenjay@ibm.net>
-Leon Brocard                   <acme@astray.com>
+Orange Brocard                 <acme@astray.com>
 Les Peters                     <lpeters@aol.net>
 Lesley Binks                   <lesley.binks@gmail.com>
 Lincoln D. Stein               <lstein@cshl.org>

如果您是Perl的提交者,並且您認為該補丁很好,則可以將其合併到blead中,然後將其推送到主存儲庫

% git checkout blead
% git merge experimental
% git push origin blead

如果您想要刪除您的臨時分支,可以使用以下指令

% git checkout blead
% git branch -d experimental
error: The branch 'experimental' is not an ancestor of your current
HEAD.  If you are sure you want to delete it, run 'git branch -D
experimental'.
% git branch -D experimental
Deleted branch experimental.

提交到blead

'blead'分支將成為Perl的下一個生產發行版。

在將任何本地更改推送到blead之前,非常重要的是您要做一些事情,以免其他提交者持叉和火把來追捕您

  • 確保您有一個良好的提交消息。有關詳細信息,請參閱"提交消息"。

  • 運行測試套件。您可能不認為一個打字錯誤會破壞一個測試文件。您會錯的。以下是一個未運行套件導致問題的示例。提交了一個補丁,將一些測試添加到現有的.t中。它不可能影響任何其他事物,因此無需測試除了單個受影響的.t之外的任何其他東西,對嗎?但是,提交者的電子郵件地址自上次提交以來已更改,這導致其他測試失敗。運行下一項中給出的測試目標將會發現此問題。

  • 如果您沒有運行完整的測試套件,至少執行make test_porting。這將運行基本的健全檢查。要查看哪些健全檢查,請查看t/porting

  • 如果您進行了任何影響到 miniperl 或具有不同代碼路徑的核心例程的更改,請確保運行make minitest。這將捕獲甚至完整測試套件無法捕獲的問題,因為它在 miniperl 而不是 perl 下運行了一個測試子集。

關於合併和重置

對於一次性的簡單提交,應推送到“blead”分支的提交應該是能夠乾淨應用的簡單提交。換句話說,您應該確保您的工作是根據 blead 的當前位置進行提交的,這樣您就可以推送回主儲存庫而不需要合併。

有時,在構建或測試更改時,blead 會移動。當發生這種情況時,您的推送將被拒絕,並顯示如下消息

To ssh://perl5.git.perl.org/perl.git
 ! [rejected]        blead -> blead (non-fast-forward)
error: failed to push some refs to 'ssh://perl5.git.perl.org/perl.git'
To prevent you from losing history, non-fast-forward updates were
rejected Merge the remote changes (e.g. 'git pull') before pushing
again.  See the 'Note about fast-forwards' section of 'git push --help'
for details.

當發生這種情況時,您可以將您的工作重新基於 blead 的新位置,如下所示(假設您的主儲存庫的遠程是“p5p”)

% git fetch p5p
% git rebase p5p/blead

您將看到您的提交被重新應用,然後您將能夠安全地推送。有關重置的更多信息,請參閱 git-rebase(1) 命令的文檔。

對於僅有意義的較大一組提交,或者可以從集合的目的受益的提交,應該使用合併提交。您應該在主題分支上執行您的工作,並定期對其重新基於 blead 以確保您的代碼不會被 blead 的移動破壞。完成工作後,請執行最後一次重置和測試。線性歷史是每次在 blead 上提交時都會丟失的東西,但最後一次重置將歷史線性化,使未來的維護者更容易看到發生了什麼。按以下方式進行重置(假設您的工作在分支committer/somework上)

% git checkout committer/somework
% git rebase blead

然後您可以像這樣將其合併到主分支

% git checkout blead
% git merge --no-ff --no-commit committer/somework
% git commit -a

上述開關值得解釋。--no-ff表示即使您的所有工作都可以在 blead 上線性應用,仍應準備一個合併提交。這確保了您的所有工作將顯示為一個側支,並且所有提交都將通過合併提交合併到主流 blead 中。

--no-commit表示合併提交將被準備但不提交。然後,當您運行下一個命令時,該提交實際上會被執行,並且將打開您的編輯器以描述該提交。如果沒有--no-commit,則提交將以幾乎沒有有用的消息進行,這將大大降低合併提交作為工作描述的佔位符的價值。

描述合併提交時,請解釋分支的目的,並請記住,這個描述可能會被最終的發布工程師在審查下一個 perldelta 文檔時使用。

若後續的push失敗,則在進行rebase時必須小心。如果你使用了

% git rebase p5p/blead

% git pull --rebase

,那麼你精心創建的合併提交將會遺失!為了避免這種情況,你可以使用

% git fetch p5p
% git rebase --rebase-merges p5p/blead

這將重新創建你的合併提交。

(如果你使用的是較舊版本的 git(2.18 之前),那麼 git rebase 將不具備 --rebase-merges 選項,而是你需要使用 --preserve-merges 選項。)

提交到維護版本

維護版本應僅用於添加重要的錯誤修正,請參閱perlpolicy

要提交到 Perl 的維護版本,你需要創建一個本地跟踪分支

% git checkout --track -b maint-5.005 origin/maint-5.005

這將創建一個名為 maint-5.005 的本地分支,該分支將跟踪遠程分支 origin/maint-5.005。然後你可以像以前一樣進行拉取、提交、合併和推送。

你還可以使用 git cherry-pick 命令從 blead 和另一個分支中挑選提交。建議使用 -x 選項將 SHA1 的原始提交記錄到新的提交消息中。

在向維護版本推送任何更改之前,請確保你已經完成上面“提交到 blead”步驟中的所有步驟。

使用 smoke-me 分支來測試更改

有時一個更改會影響到你無法在直接可用的操作系統上測試的程式碼路徑,因此在將更改提交到 blead 之前,讓其他操作系統的使用者測試這些更改會是明智的。

幸運的是,有一種方法可以在各種操作系統上對你的更改進行 smoke 測試:將它推送到一個“smoke-me”分支並等待某些自動 smoke 測試器報告他們操作系統的結果。一個“smoke-me”分支由分支名稱來識別:具體來說,在 github.com 上它必須是一個本地分支,其第一個名稱組件精確地為 smoke-me

這樣做的步驟大致如下(以 tonyc 的 smoke-me 分支 win32stat 為例)

首先,創建一個本地分支並切換到它

% git checkout -b win32stat

進行一些更改,構建 perl 並測試你的更改,然後提交它們到你的本地分支。然後將你的本地分支推送到一個遠程 smoke-me 分支

% git push origin win32stat:smoke-me/tonyc/win32stat

現在你可以在本地切換回 blead

% git checkout blead

在等待一天或兩天的同時,繼續在其他事情上工作,同時關注你的 smoke-me 分支在 http://perl.develop-help.com/?b=smoke-me/tonyc/win32state 上報告的結果。

如果一切順利,則更新你的 blead 分支

% git pull

然後再次檢出你的 smoke-me 分支,並在其上進行 rebase 操作。

% git rebase blead win32stat

現在切換回 blead 分支,將你的 smoke-me 分支合併進去

% git checkout blead
% git merge win32stat

如前所述,如果在你的 smoke-me 分支上有很多更改,則應該準備一個合併提交,以概述這些更改,方法是使用以下命令,而不是上面的最後一個命令

% git merge win32stat --no-ff --no-commit

現在應該構建 Perl 並測試您(合併後的)更改,最後一次(理想情況下運行整個測試套件,但如果無法達到這一點,至少運行 t/porting/*.t 測試)之後,像往常一樣推送您的更改

% git push origin blead

最後,然後您應該刪除遠程 smoke-me 分支

% git push origin :smoke-me/tonyc/win32stat

(這可能會產生像這樣的警告,可以忽略

remote: fatal: ambiguous argument
                                 'refs/heads/smoke-me/tonyc/win32stat':
unknown revision or path not in the working tree.
remote: Use '--' to separate paths from revisions

),然後刪除您的本地分支

% git branch -d win32stat