2010-07-11 70 views
4

我在我的倉庫中使用了過濾分支到fix an incorrect email address,但所有的分支現在都是MIA(master除外)。如何刪除過濾分支後的舊提交?

這是git graph顯示之前filter-branch

* d93c7ee (HEAD, master) Merge branch 'f1' 
|\ 
| * 08e7463 (f1) adding b 
|/ 
* 7c7bd91 adding a 

我發出了這樣的過濾器,分支命令:

git filter-branch --env-filter 'export GIT_AUTHOR_EMAIL="fixed-email"; 
           GIT_AUTHOR_NAME="fixed-author"' 

,並得到這樣的:

​​

幾件事情,打擾我:

1)f1分支未移至0f58ab5。
2)在fb012a9之前的所有提交與我無關,我可以擺脫它們嗎?

我在另一個問題有人建議,以看到:

rm -rf .git/refs/original/ 
git reflog expire --expire=now --all 
git gc --aggressive --prune=now 

但事與願違相當的幫助,這是我得到算賬:

* 770262a (HEAD, master) Merge branch 'f1' 
|\ 
| * 0f58ab5 adding b 
|/ 
* fb012a9 adding a 
* 08e7463 (f1) adding b 
* 7c7bd91 adding a 

編輯:做VonC曾建議得到了什麼此圖:

* 211632d (HEAD, master) Merge branch 'f1' 
|\ 
| * bda7577 (f1) adding b 
|/ 
* 70c7b34 adding a 
* 3182b33 (refs/original/refs/heads/master) Merge branch 'f1' 
|\ 
| * 8b81c21 (refs/original/refs/heads/f1) adding b 
|/ 
* 4c07dc9 adding a 

解決了問題#1,現在我只需要找到一種方法來擺脫第舊的提交,我該怎麼做?

回答

6

難道你再試試你的git的過濾分支與「-- --all」末,如:

git filter-branch --env-filter 'export GIT_AUTHOR_EMAIL="fixed-email"; 
             GIT_AUTHOR_NAME="fixed-author"' -- --all 

注:

  • ,從修訂選項分離過濾器分支選項--
  • --all重寫所有分支和標籤

這就是說,在當前形勢下,沒有git gc ... prune ...量將刪除提交仍由一個分支標記引用,如f1仍然指向08e7463
所以你看到的是正常的,通過設計。


的OP報告說,一旦做git filter-branch ... -- --all,一個rm -r .git/refs/original取舊提交的照顧。

再一次,這並不奇怪:沒有標籤或分支引用它們,這次意味着這次它們是永久從Git倉庫中刪除的候選項。

+0

感謝,它解決的問題之一,看到我的編輯。 – 2010-07-11 13:26:19

+0

實際上'rm -r .git/refs/original'這次做的詭計,很奇怪......謝謝! – 2010-07-11 15:05:28

+0

@Idan:感謝您的反饋。我已經完成了我的答案。 – VonC 2010-07-11 16:07:00

4

我有同樣的問題,我忘了在我的過濾器分支上做-- --all,正如VonC所建議的那樣。

git filter-branch --env-filter 'export GIT_AUTHOR_EMAIL="fixed-email"; 
             GIT_AUTHOR_NAME="fixed-author"' -- --all 

但我另外它推到一個遠程GitHub庫..

您可能需要修復的GIT_COMMITTER_NAME和GIT_COMMITTER_EMAIL相同的方式..一旦回購包括多個作者,你會需要過濾名稱。我的未配置名稱是「未知」。

git filter-branch -f --env-filter ' 
if [ "$GIT_COMMITTER_NAME" = "unknown" ] 
then 
export GIT_COMMITTER_EMAIL="fixed-email" 
export GIT_COMMITTER_NAME="fixed-author" 
export GIT_AUTHOR_EMAIL="fixed-email" 
export GIT_AUTHOR_NAME="fixed-author" 
fi 
' -- --all 

但是,因爲我想它推到了回購修復前,再經過推它,我曾在我的Git代碼歷史上的一個奇怪的雙頭結構,除了沒有,相當-orphaned裁判分支:

--E--\     --E--\ 
---A--B----\    ---A--B----\ 
    \----C--D--- master  \----C--D--- refs/original/refs/heads/master 
--E-----/    --E-----/ 

A是回購之前,我得到它,E是我的本地提交的變化,我想在合併並推至回購。

B和C都有A和E作爲父母,D是新頭。 B是我的工作中第一次從E中輸入錯誤的名稱/地址,C是過濾器分支將E中所有更改修改爲正確名稱的結果。

我用git reflog來顯示我本地克隆中的序列,然後git reset --hard A把所有的東西都放回到A處,扔掉B/C/D中的所有變化和文件。這很好,這是相同的文件,只是與不同的作者。

然後我重做了合併從E,和上面的git filter-branch,這次包括-- --all它改變了我的本地回購是

--E--\ 
---A--C-- master (plus the refs branch is still there) 

所以現在git shortlog -se表示從A和E(修正)只有作者,而不是來自B的「未知」作者。

然後我使用rm -r .git/refs/original來修剪孤立分支。 git branch現在顯示正確的東西。

當我做了一個git push的時候,它抱怨失去了提交併被拒絕了。這是真的,因爲上面的提交B正是我想要擺脫的。

git push -f訣竅。但確保你在回購中擁有你想要的一切,因爲它具有破壞性。但最終,遠程github回購與我的本地結構相匹配,而不是突變。

哦,爲了獲得額外的樂趣,如果你使用的是msys Git for windows,那麼你可能需要更新,我無法使用1.52的filter-branch,但在更新到1.74後仍然可以正常工作。

+0

生命力,完美工作 – Sam 2013-06-17 13:01:38

0

如果要修改所有的樹枝記得使用--all

git filter-branch $options -- --all 

,並刪除舊的引用:

rm -rf .git/refs/original