当文件在移动后被显着修改时,Git 不会检测到重命名

标签 git

考虑这个测试脚本。

#!/bin/sh -x
rm -rf test
git init test
cd test
for I in {1..100}; do
    echo $I >> x
done
git add x
git commit -am "initial commit"
git checkout -b branch
git mv x y
git commit -am "renamed"
rm y
for I in {1..60}; do
    echo branch$I >> y
done
for I in {61..100}; do
    echo $I >> y
done
git commit -am "changed the first 60 lines in branch"
git checkout master
rm x
for I in {1..60}; do
    echo master$I >> x
done
for I in {61..100}; do
    echo $I >> x
done
git commit -am "changed the first 60 lines in master"
git merge -s recursive -X patience branch
git status

我想要发生的是让 git 检测到 x 在分支中被重命名为 y,并给我机会解决 merge 冲突。

相反,git 忽略(未能检测到)重命名,并说 x 在分支中被删除,同时创建了一个新的不相关文件 y。 我怎样才能说服 git 将其作为重命名的文件来处理?

谢谢!

最佳答案

你是对的:git 进行重命名检测,而不是重命名跟踪,如果文件更改“太多”(对于“太多”的某些值),git 会声明这是一个不同的文件,而不是而不是重命名的文件。

没有完美的解决方法。如果您的 git 足够新(1.7.4 或更高版本),通常最好的选择是通过 -X rename-threshold=<n>标记为 git merge .降低阈值会使 git 检测到更多重命名(您可以使用 git diff -M 来测试合适的阈值)。

关于当文件在移动后被显着修改时,Git 不会检测到重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34755563/

相关文章:

git - 审查板 's post-review can' 无法与 git 一起使用,为什么?

git - 为什么我必须在更改提交消息后强制推送?

git fsck : duplicateEntries: contains duplicate file entries - cannot push to gitlab

Git 推送到 bitbucket 中的新分支

python - 为不同版本的 Python 维护不同版本代码库的工作流

git - 如何在从 git config --edit 更改行后保存配置

git - 忽略子文件夹中的 .git 文件夹

git - 我如何制作一个 git 钩子(Hook)来修改然后镜像一个 git 存储库?

git - 为什么 git push origin master 不起作用?

git - 设置远程使用指定端口进行 ssh