造成致命后果的原因:错误的修订版以及如何修复此git命令?

时间:2019-08-28 18:49:24

标签: git git-bash git-filter-branch

我需要从git存储库的历史记录中完全删除一个文件夹及其所有文件,并且我需要忽略对该文件夹的任何将来更改。

我已经使用Git-Bash尝试了一个filter-branch命令,其中嵌套了git remove命令。下面是我的命令。

git filter-branch --force --index-filter \ "git rm -rf --cached --ignore- unmatch C:\Foldername" \--prune-empty --tag-name-filter cat -- --all

我希望从存储库的所有版本中删除该文件夹,但是我收到一条错误消息:

fatal: bad revision 'git rm -rf --cached --ignore-unmatch C:\Foldername'

然后我尝试了以下命令:  git rm -rf --cached --ignore-unmatch "C:\Foldername" 它自己工作。但是,这无法完成从存储库的整个历史记录中删除文件夹的任务。

更新: 我只是运行了删除“ git”之前的空格的命令。如下所示。

git filter-branch --force --index-filter \ "git rm -rf --cached --ignore- unmatch C:\Foldername" \--prune-empty --tag-name-filter cat -- --all

我现在收到此消息:

fatal: C:Foldername: 'C:Foldername' is outside repository index filter failed: git rm -rf --cached --ignore-unmatch C:\Foldername rm: cannot remove 'C:/.git-rewrite': Directory not empty

1 个答案:

答案 0 :(得分:0)

您有很多奇怪的反斜杠,就像您在原来的多行命令 example 上使用剪切粘贴一样:

echo I \
am a \
multi-line \
example

但将其变成一行而不删除反斜杠:

echo I \ am a \ multi-line \ example

尝试同时运行这两个字符(一个换行),以便每个反斜杠是实际完整行的最后一个字符,一个不包含反斜杠,然后比较输出:

$ echo I \
> am a \
> multi-line \
> example
I am a multi-line example
$ echo I \ am a \ multi-line \ example
I  am a  multi-line  example

您能看到两个输出之间的区别吗?它与空白有关,有时很难分辨。我想使用第二个技巧,基于wc命令在错误消息中打印其参数的事实,每行一个:

$ wc I \ am a \ multi-line \ example
wc: I: No such file or directory
wc: ' am': No such file or directory
wc: a: No such file or directory
wc: ' multi-line': No such file or directory
wc: ' example': No such file or directory
0 0 0 total

请注意,尝试打开的文件wc被命名为I' am'(带有前导空格的文件名),依此类推。

在这种情况下,git filter-branch认为它应使用的--index-filter,这是一条不会做太多的命令(但实际上在这里有效)。然后, next 之后是提交选择器,但它不能作为提交选择器。这就是您的错误出处。

在这种情况下,由于您使用多行,因此您只需删除所有反斜杠即可。这将给您带来另一个问题,因为git rm -rf --cached应该被赋予相对文件名,而不是完整的路径名。

相关问题