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

时间:2013-02-22 16:17:57

标签: 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"

现在,我正在尝试将my_file.txt更改为your_file.txt

$ git filter-branch --index-filter 'git mv my_file.txt your_file.txt' HEAD

但它不起作用:

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

但是,执行的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
#

我确信,我在这里缺少必要的东西 - 但它是什么?

2 个答案:

答案 0 :(得分:11)

正如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

答案 1 :(得分:3)

git mv--index-filter子句中并不合适。由于--index-filter没有检出每个提交,它会重写到工作目录中,git mv在工作目录上运行(除了索引),在git mv中使用--index-filter {1}}无法实现预期目标。请改用--tree-filter。 (有可能通过使用--index-filter代替git update-index来完成此操作,但我不能提供这个功能。