【发布时间】:2017-05-31 02:44:06
【问题描述】:
我正在清理从另一个开发团队接管的 git 存储库。新的开发团队不需要原始的 commit 哈希(众所周知,在交互式 rebase 中修改提交后,每个后续提交都有不同的哈希。),所以我可以rebase/cherry-pick/graft/filter-branch... 直到存储库“干净”为止。
另一个团队混合使用了 Windows 和 Linux 行尾。在master 上时,我添加了一个新分支,检查了cleanup 分支中的根提交,添加了一个合理的.gitattributes 文件,并修改了根提交。现在我的存储库有 2 个根提交,正如预期的那样。
接下来,我想将 master 分支挑选到 cleanup 分支(稍后将成为新的 master 分支)的根提交上。我使用了这个命令(14c4a129 显然是master 分支的根提交):
git cherry-pick 14c4a129..master -Xignore-space-change
但是,通过樱桃采摘的四分之一中止
error: Your local changes to the following files would be overwritten by merge:
(list of files)
Please commit your changes or stash them before you merge.
Aborting
这些文件中的更改只是空白,因为git diff -w 变成空白。另一个线索:find src -type f -print0 | xargs -0 file | sort | grep 'CRLF' 给了我与git status 完全相同的文件列表。
当 git 日志中出现使用不同行尾的新开发人员时,就会发生这种情况。准确地说,在他的第二次提交时,樱桃采摘失败了。我假设发生的是,他的第一次提交得到了规范化的行结尾,但随后他的下一次提交再次获得了原始的 CRLF 行结尾,这与提交的文件冲突,在下一次提交可以被挑选之前.
但是,我期待 -Xignore-space-change 会为我解决这个问题,所以我根本不需要进行任何手动干预。看来我理解错了。
我也试过--strategy=recursive --strategy-option=renormalize,结果一样。
我还尝试使用master 分支的交互式变基,编辑(修改)根提交以添加.gitattributes,并保留所有后续提交 - 这与樱桃采摘基本相同,除了它发生在另一个分支。
使用假设的“overwrite-whatever-is-here-dammit”选项解决此问题的正确方法是什么?我也愿意接受涉及 master 分支的交互式变基的答案,我只修改根提交,因为最终结果与樱桃选择相同。
- 在修改根提交后不需要任何人工干预的答案将被投票。
- 导致手动修复单个提交的答案将被否决。
- 那些让我进一步澄清我的问题的评论将被点赞。
【问题讨论】:
-
我真的不在乎你是否对我投反对票,但我认为问一下为什么这很重要很重要:“新的开发团队不需要拥有原始的 SHA 哈希值”。即使按照您的建议(摘樱桃),也会有大量具有相同哈希值的对象。
-
对象,是的。承诺,不。一旦你修改了一个提交,每个后续的提交都会有一个不同的哈希值。感谢您的提问,我会更新我的问题以澄清。
标签: git