一个分支(refactoringBranch
)有一个完整的目录重组。文件被混乱地移动,但内容被保留。
我试着合并:git merge --no-ff -Xrename-threshold=15 -Xpatience -Xignore-space-change refactoringBranch
git状态显示了大约一半的文件重命名识别。但是在项目中的10000个文件中,有一半没有被识别为移动。
例如:
# On branch master
# Changes to be committed:
# deleted: 404.php
# new file: public_html/404.php
...
# deleted: AnotherFile.php
# new file: public_html/AnotherFile.php
...
# renamed: contracts/css/view.css -> public_html/contracts/css/view.css
有什么建议?
史前
重构是在git之外进行的。我做了以下操作:
1.已创建源自master
的refactoringBranch
。
1.把修改过的结构放到refactoringBranch
里面,这意味着我在其他目录下做了修改,然后把它们复制粘贴到我的git仓库中。
1.添加并提交所有内容,然后尝试合并。
这是我的工作流程:
git checkout -b refactoringBranch
cp -R other/place/* ./
git add . -A
git commit -a -m "blabla"
git checkout master
git merge --no-ff -Xrename-threshold=15 -Xpatience -Xignore-space-change refactoringBranch
问题可能出现在git add . -A
步骤,因为如果重命名检测在那里是正确的,我会假设合并会完美无瑕。
7条答案
按热度按时间92dk7w1h1#
OS X是区分大小写的,但不区分大小写。Git * 是 * 区分大小写的。如果你改变了文件名,而唯一的改变是大小写的改变,请将文件重命名回原来的样子,然后使用
git mv
来重命名。ltskdhd12#
重命名检测:
我最好的猜测是重命名检测失败是因为候选项的数量太多。git源代码有些地方有点难以理解,但看起来确实有一些硬编码的限制用于重命名检测算法的特定搜索步骤(参见
diffcore-rename.c
),以及对要查看的最大对数的可配置限制(配置键diff.renameLimit
和merge.renameLimit
)。这可能会使检测失败,即使您已将配置限值设置得适当高。可配置限值本身被限制在范围[1,32767]内。也许您可以通过首先执行重组步骤来解决此问题:用git mv移动文件而不做任何内容更改,为了匹配新的布局,在新的分支上提交,然后用你的最终版本替换它,这个版本应该只有内容更改,没有重命名。没有内容更改的重命名 * 可能 * 会被更可靠地检测到。这只有在你所做的重构相当简单的情况下才可行,而且我不确定它是否能解决重命名检测失败的问题。
或者,您可以使用一些简单的文件分组将更改拆分到单独的提交中,这样在每个提交中检测重命名的候选项就更少了。
正在合并:
不幸的是,在master上创建新分支时,你给git的合并信息是错误的。不管是否正确检测到重命名,当新创建的分支与master合并时,它会覆盖master中的所有内容,因为从git的Angular 来看,master中的所有更改都已经包含在新分支中了。
3df52oht3#
这里有一个让git知道你重命名文件的完美方法。
然后git会拾取这些更改。
请慢用
weylhg0b4#
尝试
git commit --dry-run -a
而不是git status
,它可以更好地检测重命名。thigvfpy5#
您可以考虑改用
git mv
:https://www.kernel.org/pub/software/scm/git/docs/git-mv.html根据我的经验,它要可靠得多。
qc6wkl3g6#
每当我必须重命名/移动文件而忘记明确告诉GIT时,我就使用
自动检测被移动的文件
4dc9hkyq7#
我刚刚遇到了一个类似的问题,在我的例子中,重命名被另一个提交所更改,在我的Git for Windows上尝试重新更改为另一个失败,直到我意识到有一个对应的git配置。在我的系统中,
git config
列出了一个配置为core.ignorecase=true
。通过使用
git config core.ignorecase false
将其设置回false来禁用它对我来说很有效。值得快速检查一下,看看这是否导致了git中的大小写检测失败。这已经在git version 2.33.0.windows.2上尝试过了。