git rm后跟git filter-branch失败,无法使用脏工作目录消息重写分支

时间:2016-05-21 08:42:19

标签: git github git-filter-branch

git filter-branch失败,"无法使用脏工作目录消息重写分支"如果" git rm"命令在它之前运行。尽管"无法使用脏工作目录消息重写分支,但git filter-branch命令设法擦除指定的文件夹。因此,我不明白错误信息的真正含义以及对我正在做的事情的影响。

我在Linux上使用git 1.7.1版。请参阅下面的确切命令。

git clone ...
cd /home/userid/fpcnav_test
git rm -q -r -f  --ignore-unmatch olddir1
git filter-branch --force --index-filter "git rm -q -r -f --ignore-unmatch olddir2 --prune-empty --tag-name-filter cat -- --all

似乎" git rm"使工作目录变脏,这使git filter-branch命令失败。我通过在git rm和git filter命令之间运行git stash(或got commit -m ...)命令来解决这个问题。我的目的是运行一系列的" git rm"和" git filter-branch"除非我在每个git rm和git filter-branch之间进行git存储,否则不能干净地执行命令。这样做有没有干净的方法?最后,我将针对原始存储库而不是克隆存储库运行这些命令。感谢。

1 个答案:

答案 0 :(得分:1)

首先,警告:不要在活动状态下运行filter-branch --prune-empty ... --all:它往往会破坏它们。 (如果保持空提交,它可能正常,因为破坏是由删除特殊存储伪合并的明显空索引提交引起的。这基于an answer I provided quite a while ago where someone had a corrupted stash after using filter-branch。)

当然:当然 git rm(如果成功)会污染工作目录,因为您现在已准备好进行实际删除了这些已删除文件的新提交。在执行filter-branch之前执行此操作是没有意义的(与其过滤器具有相同的git rm - 您可能希望添加--cached),因为过滤git rm将会也适用于当前的提交。

请记住,filter-branch类似于类固醇上的rebase:它会复制每个过滤的提交。创建副本后,filter-branch调整指定的引用(分支名称和标记名称,如果给定标记过滤器)以指向原始提交的副本版本(或者,对于通过--prune-empty删除的提交或者一个跳过提交的提交过滤器,最合适的复制提交。)