10

因此,我尝试使用 重命名我的存储库中的文件夹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.txtyour_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
#

我敢肯定,我在这里遗漏了一些重要的东西 - 但它是什么?

4

2 回答 2

15

正如 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
于 2013-02-22T17:14:25.880 回答
4

git mv--index-filter在子句中并不真正合适。由于--index-filter不检查每个提交,它重写到工作目录,并git mv在工作目录上操作(除了索引),使用git mvin--index-filter不会完成预期的工作。改用 a --tree-filter。(可能仍然可以--index-filter通过使用来完成此操作git update-index,但我没有想到它可用)。

于 2013-02-22T17:17:21.037 回答