filter-branch --index-filter总是失败"致命:坏源"

Dan*_*rth 7 git

所以,我正在尝试使用我的存储库重命名文件夹git filter-branch --index-filter,但我总是以"致命:错误的来源"错误结束.

使用文件而不是文件夹在测试存储库中可以轻松演示此问题.

制备:

$ git init
$ echo whatever >> my_file.txt
$ git add .
$ git commit -m "initial"
$ echo whatever2 >> my_file2.txt
$ git add .
$ git commit -m "second"
Run Code Online (Sandbox Code Playgroud)

现在,我想my_file.txt改为your_file.txt:

$ git filter-branch --index-filter 'git mv my_file.txt your_file.txt' HEAD
Run Code Online (Sandbox Code Playgroud)

但它不起作用:

Rewrite dac9a2023bdf9dd0159fab46213d9e1342ae9f75 (1/2)fatal: bad source, source=my_file.txt, destination=your_file.txt
index filter failed: git mv my_file.txt your_file.txt
Run Code Online (Sandbox Code Playgroud)

但是,git mv执行的相同命令通常可以正常工作:

$ git mv my_file.txt your_file.txt
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    my_file.txt -> your_file.txt
#
Run Code Online (Sandbox Code Playgroud)

我相信,我错过了一些必不可少的东西 - 但它是什么?

Dan*_*rth 12

正如twalberg在他的回答中指出的那样,git mv不只是访问索引,它还访问磁盘.这可能就是为什么它不起作用的原因.

我不想使用慢速,--tree-filter所以我尝试从git filter-branch手册页更改示例,该手册页显示了如何将完整的存储库移动到子文件夹中.

结果是这 - 它实际上有效;-)

git filter-branch --index-filter '
git ls-files -s | \
sed "s-\(\t\"*\)my_file.txt-\1your_file.txt-" | \
GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && \
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
' HEAD
Run Code Online (Sandbox Code Playgroud)

  • 有关上述脚本的更详细说明,请参阅此博客文章:[用Git重命名过去](http://www.fussylogic.co.uk/blog/?p=1250). (2认同)
  • 我使用了你的答案[帮助那些也正在处理重命名问题的人](http://stackoverflow.com/a/23842072/456814),以及详细说明.感谢提示`;)` (2认同)