2011-10-04 47 views
126

我有同樣的問題,這裏問:New git repository in root directory to subsume an exist repository in a sub-directory在filter-branch --tree-filter之後從git repo中刪除refs/original/heads/master?

我跟着這個答案在這裏:New git repository in root directory to subsume an exist repository in a sub-directory

現在,gitk --all顯示了兩個歷史:一個在當前master高潮,和一個命名original/refs/heads/master

我不知道這第二個歷史是什麼,或者如何從回購中刪除它。我的資源庫中不需要兩個歷史記錄。

我該如何擺脫它?

要重現自己:

mkdir -p project-root/path/to/module 
cd project-root/path/to/module 
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done 
git init 
git add . 
git commit -m 'Initial commit' 

現在我們有原來的海報的問題。讓我們用上面鏈接的答案混帳回購協議的根移動到項目根:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD 
rm -rf path 
cd ../../../ # Now PWD is project-root 
mv path/to/module/.git . 
git reset --hard 

現在,看到我目前的問題:

gitk --all & 
git show-ref 

如何擺脫refs/original/heads/master和所有相關的歷史?

+1

可能重複[如何刪除運行git過濾後的悠久歷史-branch?](http://stackoverflow.com/questions/5984428/how-to-delete-the-history-after-running-git-filter-branch) – user

回答

213

refs/original/*是否有作爲備份,以防你搞亂你的過濾器分支。相信我,這是一個真的好主意。

一旦你檢查的結果,你非常有信心,你有你想要的東西,你可以刪除備份裁判:

git update-ref -d refs/original/refs/heads/master 

,或者如果你這樣做了許多裁判和你想消滅這一切:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 

(這是直接取自過濾器分支手冊頁。)

這並不適用於你,但其他人誰可能會發現:如果你做過濾麩皮ch其中刪除內容佔用大量磁盤空間,您可能還想運行git reflog expire --expire=now --allgit gc --prune=now以過期您的reflog並刪除現在未使用的對象。 (警告:徹底,完全不可逆轉非常肯定你這樣做之前。)

+0

做了update-ref之後,reflog expire和gc ,這兩個文件仍然參考原始參考:.git/info/refs和.git/packed-refs 看起來也許應該這樣說:'git update-ref -d refs/original/refs/heads /主' – lhunath

+1

我猜你不小心混了e字:如果我是對的,它應該是'git update-ref -d original/refs/heads/master'?但是,只有你的第二個命令爲我工作。 – JJD

+4

這是'git update-ref -d refs/original/refs/heads/master'順便說一句。你可以用'git show-ref'來看全名。 – poke

4

如果你在Windows PowerShell中:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ } 
相關問題