git不再能够重写历史记录

时间:2017-10-09 17:18:33

标签: git

我一直在使用以下命令:

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

将目录树从子目录“subdir”移动到顶层。 为了在不同且成功的过滤器树之后清理回购,我尝试使用:

git filter-branch --tag-name-filter cat -- --all
git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' 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 缺少一些知识。有人可以建议那可能是什么吗?

1 个答案:

答案 0 :(得分:3)

重写失败,因为至少有一个提交,其中' 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

对于 - index-filter ,这似乎相当于 - ignore-unmatch

我仍然不确定为什么空提交没有被前一个删除:

git filter-branch --prune-empty --tag-name-filter cat -- --all
git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' HEAD

然而,有一个解决方案(来自此question):

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

这会删除初始提交,这只是一个没有文件的注释(由于之前的重写)。一旦完成,&#34 ;; / bin / true&#34;可能不再需要技巧。