簡體   English   中英

刪除對已刪除文件的提交

[英]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

在此之后,我還有一些提交僅與現在刪除的文件相關。 有沒有一種方法可以清除此問題,即刪除不再在歷史記錄中的文件上的提交?

TL; DR

如果確實存在,則可以使用--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來維護邏輯結構。

更有趣的情況是DE自己崩潰了,因為現在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM