[英]Remove commit on now deleted files
我使用git filter-branch
清理了我的存儲庫,使用以下命令刪除了一些文件夾:
git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch folder' \
--prune-empty --tag-name-filter cat -- --all
在此之后,我還有一些提交僅與現在刪除的文件相關。 有沒有一種方法可以清除此問題,即刪除不再在歷史記錄中的文件上的提交?
如果確實存在,則可以使用--prune-empty
運行否則--prune-empty
第二個過濾器分支以丟棄它們。
在此之后,我還有一些提交僅與現在刪除的文件相關。
那應該很少見,因為您包括了:
--prune-empty
它指示filter-branch
忽略匹配其父級的任何簡單(非合並)提交。
有可能您進行了一些合並,合並了兩個在輸入點原本相同的分支,但是這些提交無法刪除,因為它們合並了原本相同的分支。
例如,假設在過濾之前我們具有以下分支結構:
B--C
/ \
...--o--A M--o--...
\ /
D--E
提交M
是合並,必須保留(保持原樣),但是假設A
-vs- B
崩潰了,因為在過濾之后, B
匹配了A
,而C
-vs- B
(或vs- A
)也崩潰了原因,給出:
...--o--A'-----M'-o--...
\ /
D'-E'
(字母后面的勾號或撇號表示它們是原始提交的副本-如果較早沒有更改,則A'
可能是 A
,但這涵蓋了更一般的情況)。 即使在沒有原始刪除文件的情況下進行提交,即使確實可以進行快速轉發,實際上仍然需要M
來維護邏輯結構。
更有趣的情況是D
和E
自己崩潰了,因為現在M
仍然是過濾分支過程的輸入,並且仍然有兩個父代,但是兩個父代都映射為提交A'
本身 。 我不確定,如果不看,這里會發生什么:filter-branch是否可以與A'
一起作為M'
的兩個父對象列出兩次的合並提交? 如果嘗試這樣做, git commit-tree
將提交M'
作為普通的非合並提交寫入? 測試說不:
$ mkdir mtest
$ cd mtest
$ git init
Initialized empty Git repository in ...
$ echo test commit-tree > README
$ git add README
$ git commit -m initial
[master (root-commit) 1db1f76] initial
1 file changed, 1 insertion(+)
create mode 100644 README
$ echo log msg | git commit-tree -p HEAD -p HEAD HEAD^{tree}
error: duplicate parent 1db1f76a4e7217d5198c0f178464b7a087e94078 ignored
44f91061b7bd08c39a4dc9e8ebb1f4f7c588ea9e
因此,似乎幼稚的filter-branch
將嘗試使M'
並將其作為單親提交:
...--o--A'-M'-o--...
M'
和A'
沒有區別。 過濾器分支代碼對此進行了檢查:
for parent in $parents; do
for reparent in $(map "$parent"); do
case "$parentstr " in
*" -p $reparent "*)
;;
*)
parentstr="$parentstr -p $reparent"
;;
esac
done
done
(如果您提供自己的父級過濾器,則在檢查之后會發生這種情況,您將需要自己進行重新檢查。)
因此,如果您得到這樣的...--A'-M'-...
結果,則僅使用--prune-empty
的第二個過濾器分支將它們--prune-empty
。
我在此頁面的第6步中找到了答案: https : //github.com/epics-modules/motor/wiki/Creating-a-standalone-driver-module
git filter-branch --prune-empty --parent-filter 'sed "s/-p //g" | xargs -r git show-branch --independent | sed "s/\</-p /g"'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.