2017-10-09 88 views
0

我一直在使用類似這樣的命令:混帳不再能夠改寫歷史

git filter-branch --index-filter \ 
      'git ls-files -s | sed "s_subdir/__" | 
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
          git update-index --index-info && 
      mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD 

從一個子目錄「子目錄」的頂級移動目錄樹。 爲了一個不同的,也是成功的過濾器樹清理後回購,我嘗試使用:

git filter-branch --tag-name-filter cat -- --all 
git filter-branch --commit-filter 'git_commit_non_empty_tree "[email protected]"' HEAD 
git reflog expire --all --expire=now 
git gc --prune=now --aggressive  

這混合了幾個建議從溜。 然而,不再做這個過濾器分支後的工作:

Rewrite 07436df7a2795910fb0b718d1a1b84e195cfabea (1/113) (0 seconds passed, remaining 0 predicted) mv: cannot stat ‘somepathhere/.git-rewrite/t/../index.new’: No such file or directory 
index filter failed: git ls-files -s | sed "_subdir/__" | 
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
git update-index --index-info && 
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" 

我一點兒也不明白爲什麼這應該是或在「巫術」的清理我以前負責的命令。很顯然,我的git-fu中缺少一些知識。有人可以建議這可能是什麼?

+0

確實'07436df7a2795910fb0b718d1a1b84e195cfabea'有寫入子目錄嗎? –

+0

該命令是將repo的內容從「subdir」移動到目錄的根目錄。每個提交都必須存在根目錄,如果這就是「寫入」子目錄的含義。我相信所有提交都存在子目錄,並且我使用--prune-empty重寫了它。但是.git-rewrite不存在,當然也不應該用於任何提交。 –

+0

其實,我不知何故使用同音字;我的意思是「正確的」子目錄。 'subdir /'是否存在於它提到的提交樹中?如果你的git結帳07436df,你會得到什麼; ls'? (有一些方法可以看一下提交的樹,但我不記得它是什麼,並且目前沒有'git'可用) –

回答

1

重寫失敗,因爲至少有一個提交'subdir'不存在。 爲我的作品的解決辦法是改變過濾器加入到忽略erorrs「; /斌/真

git filter-branch --index-filter \ 
      'git ls-files -s | sed "s_subdir/__" | 
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
          git update-index --index-info && 
      mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"; /bin/true' HEAD 

這似乎是- 忽略UNMATCH相當於 - 索引過濾器

我仍然不清楚爲什麼空提交不是由以前的刪除:

git filter-branch --prune-empty --tag-name-filter cat -- --all 
git filter-branch --commit-filter 'git_commit_non_empty_tree "[email protected]"' HEAD 

然而,有是一個解決方案(從這個question):

git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD 

這剪的初始提交,它只是一個沒有文件的註釋(由於較早的重寫)。一旦完成,可能不再需要「/ bin/true」技巧。