我已将我的OSS项目从SourceForge SVN移至GitHub Git 在导入过程中,我得到了一个页面,我可以将SF用户名映射到GitHub用户名。
由于我的开发人员只是慢慢创建他们的GitHub帐户,我会回到该页面并在我了解它后立即添加帐户。
但是当我现在用git shortlog -sne
查看开发人员时,我会找到一些开发人员行,他们的通用SF转换名称如
foo <foo@b3ce15a5-0815-abcd-b6eb-98bdc3a999cb>
...
Foo Bar <foobar@users.noreply.github.com>
两者都是完全相同的帐户 - 一个是SF一个,另一个是GitHub帐户。当然,两者都在导入工具中链接,如上所述。
我如何统一这些线?
我可以使用https://help.github.com/articles/changing-author-info/ - 而不会破坏现在每个人都拥有的克隆和分叉吗?
(“完成这些步骤之后,任何拥有叉子或克隆的人都必须获取重写的历史记录并将任何本地更改重新映射到重写的历史记录”?这就是必须要做的事情?)
答案 0 :(得分:1)
罪魁祸首似乎是执行“破坏性行动”意味着什么,以及重写已经公开的历史,即推动它的意义。
在git用语中,破坏性操作是对分支的提交执行操作的操作,这导致替代历史。最常被引用的例子是重新定位已被推动并可能被其他人拉出的分支。在您的情况下使用的git filter-branch
是另一个例子。
网上有很多文章解释了为什么重新定位公共分支是一个坏主意。这同样适用于filter-branch
。它的要点如下:
如果更改提交C中的任何内容(包括创作信息),则C和任何将C作为祖先的提交都将收到新的哈希。在最简单的情况下,比方说,我们有一个分支并重写一些提交。现在分支无法推送到存储库,因为推送只能在顶部添加内容。但重写创建了一个并行分支。它与旧版本几乎相同并不重要,重写创建了一个新哈希,这就是最重要的。
所以在C中改变作者
A--B--C--D branch
结果
A--B--C--D branch
\
C'--D' branch'
为了让它进入回购,你必须进行强制推动(git push --force
)。如果其他人已经在分支机构的顶部创建了本地提交,则必须将它们重新定位到分支的新版本上:
E--F--G some-feature-branch
/
A--B--C--D branch
\
C'--D' branch' (the new "truth")
必须改为
E--F--G some-feature-branch
/
A--B--C--D branch
\
C'--D' branch' (the new "truth")
\
E'--F'--G' some-feature-branch'
如果开发人员很少,可以像这样解决这个问题:
如果你有很多开发人员并且无法阻止提交,我认为没有一个解决方案不会造成任何混乱。这是您为整个存储库进行完整性检查所支付的(非常低的)价格。