1

是否有可能通過一次傳遞git filter-branch來批量重命名2個或更多的電子郵件地址?重命名多個名稱和電子郵件git-filter-branch的單個傳遞

我試圖只是複製if..fi clausethis answer適應代碼:

git filter-branch --commit-filter ' 
     if [ "$GIT_COMMITTER_NAME" = "<Old Name 1>" ]; 
     then 
       GIT_COMMITTER_NAME="<New Name 1>"; 
       GIT_AUTHOR_NAME="<New Name 1>"; 
       GIT_COMMITTER_EMAIL="<New Email 1>"; 
       GIT_AUTHOR_EMAIL="<New Email 1>"; 
       git commit-tree "[email protected]"; 
     else 
       git commit-tree "[email protected]"; 
     fi 
     if [ "$GIT_COMMITTER_NAME" = "<Old Name 2>" ]; 
     then 
       GIT_COMMITTER_NAME="<New Name 2>"; 
       GIT_AUTHOR_NAME="<New Name 2>"; 
       GIT_COMMITTER_EMAIL="<New Email 2>"; 
       GIT_AUTHOR_EMAIL="<New Email 2>"; 
       git commit-tree "[email protected]"; 
     else 
       git commit-tree "[email protected]"; 
     fi' HEAD 

但它給了我這個樣子過濾分支中的錯誤:

error: duplicate parent bc8f9924c33558a275b8f694969529cf56232c80 ignored 

然後分支歷史全都糾纏不清:

enter image description here

回答

2

根據需要設置所有環境變量後,您只需要一個git commit-tree命令。例如,你的提交過濾器可能會讀這樣的事情:

git filter-branch -f --commit-filter ' 
    if [ "$GIT_COMMITTER_NAME" = "<Old Name 1>" ]; then 
     GIT_COMMITTER_NAME="<New Name 1>"; 
     GIT_AUTHOR_NAME="<New Name 1>"; 
     GIT_COMMITTER_EMAIL="<New Email 1>"; 
     GIT_AUTHOR_EMAIL="<New Email 1>"; 
    fi; 
    if [ "$GIT_COMMITTER_NAME" = "<Old Name 2>" ]; then 
     GIT_COMMITTER_NAME="<New Name 2>"; 
     GIT_AUTHOR_NAME="<New Name 2>"; 
     GIT_COMMITTER_EMAIL="<New Email 2>"; 
     GIT_AUTHOR_EMAIL="<New Email 2>"; 
    fi; 
    git commit-tree "[email protected]" 
    ' 

(雖然如果做出的名稱更改次數變高我可能會通過映射文件,而不是一長串易於運行錯別字if ... then s,分別映射作者和提交者可能更有意義)。

記住filter-branch只是副本你告訴它(通過使用git commit-tree使新副本)進行復制,同時建立地圖<老-SHA1,新-SHA1>雙的提交。這就是爲什麼進行兩次提交併不好:一個現有的(舊)SHA-1現在必須映射到兩個新的副本,根據filter-branch對提交圖的做法,這是不允許的。 (多箇舊的SHA-1可以映射到一個新的SHA-1,如果你選擇省略複製過程中的一些提交。也就是說,新圖形可以是雙射或全射的,但是濾鏡分支並不是真的相信內射,因爲它會嘗試將舊參考映射到新圖。)