我需要从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
答案 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
应该被赋予相对文件名,而不是完整的路径名。