我一直在使用如下命令:

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"

我一点也不清楚这是为什么,或者我使用的“巫毒”清理命令中的哪一个是我的责任。很明显,我的书中缺少一些知识。有人能告诉我那是什么吗?

最佳答案

重写失败了,因为至少有一个提交,在这里不存在“不存在”。
对我有效的修复方法是通过添加“;/bin/true”将筛选器更改为忽略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

这似乎相当于--忽略不匹配的--索引筛选器。
我仍然不确定为什么前面的命令没有删除空提交:
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

这将剪掉初始提交,它只是一个没有文件的注释(由于先前的重写)。完成后,可能不再需要“;/bin/true”技巧。

关于git - git不再能够重写历史记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46651781/

10-13 09:40