SVN 迁移后清理 GitHub 历史记录中的作者
Clean up authors in GitHub history after SVN migration
我已将我的 OSS 项目从 SourceForge SVN 移至 GitHub Git。
在导入过程中,我得到了一个页面,我可以在其中将 SF 用户名映射到 GitHub 用户名。
由于我的开发人员只是在缓慢地创建他们的 GitHub 帐户,所以我一熟悉它就会返回该页面并添加该帐户。
但是当我现在查看使用 git shortlog -sne
的开发人员时,我得到了一些开发人员行,他们的通用 SF-transition 名称如
foo <foo@b3ce15a5-0815-abcd-b6eb-98bdc3a999cb>
...
Foo Bar <foobar@users.noreply.github.com>
两者是完全相同的帐户 - 一个是 SF 帐户,另一个是 GitHub 帐户。当然,如上所述,两者都已在导入工具中链接。
如何统一这些行?
我可以使用 https://help.github.com/articles/changing-author-info/ - 不破坏每个人现在拥有的克隆和分支吗?
("After completing these steps, any person with forks or clones must fetch the rewritten history and rebase any local changes into the rewritten history" 是什么意思?即必须准确完成什么?)
罪魁祸首似乎是执行 "destructive operation" 以及重写已经 public 的历史意味着什么,即推送。
用git的说法,破坏性操作是对分支的提交执行操作,从而产生替代历史。最常被引用的例子是 rebase 一个已经被推送并且可能被其他人拉取的分支。 git filter-branch
你的案例中使用的是另一个例子。
网络上有很多文章解释了为什么变基 public 分支不是一个好主意。 filter-branch
也是如此。其要点如下:
如果您更改提交 C 中的任何内容(包括创作信息),C 和任何以 C 作为祖先的提交都将收到一个新的哈希值。在最简单的情况下,比如说,我们有一个分支并重写了一些提交。现在分支无法推送到存储库,因为推送只能在顶部添加东西。但是重写创建了一个并行分支。跟老版本差不多没关系,重写创建了一个新的hash,这才是最重要的。
所以在 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'
如果你的开发人员很少,你可以这样解决这个问题:
- 告诉大家全力以赴,停止工作。
- 执行你的破坏性操作。
- 强制推送所有内容。
- 告诉大家拉。这将自动更新分支并为每个受影响的分支显示 "forced update" 指示器。
如果您有很多开发人员并且根本无法停止提交,我认为没有不会造成任何混乱的解决方案。这是您为整个存储库的完整性检查支付的(恕我直言)价格。
我已将我的 OSS 项目从 SourceForge SVN 移至 GitHub Git。
在导入过程中,我得到了一个页面,我可以在其中将 SF 用户名映射到 GitHub 用户名。
由于我的开发人员只是在缓慢地创建他们的 GitHub 帐户,所以我一熟悉它就会返回该页面并添加该帐户。
但是当我现在查看使用 git shortlog -sne
的开发人员时,我得到了一些开发人员行,他们的通用 SF-transition 名称如
foo <foo@b3ce15a5-0815-abcd-b6eb-98bdc3a999cb>
...
Foo Bar <foobar@users.noreply.github.com>
两者是完全相同的帐户 - 一个是 SF 帐户,另一个是 GitHub 帐户。当然,如上所述,两者都已在导入工具中链接。
如何统一这些行?
我可以使用 https://help.github.com/articles/changing-author-info/ - 不破坏每个人现在拥有的克隆和分支吗?
("After completing these steps, any person with forks or clones must fetch the rewritten history and rebase any local changes into the rewritten history" 是什么意思?即必须准确完成什么?)
罪魁祸首似乎是执行 "destructive operation" 以及重写已经 public 的历史意味着什么,即推送。
用git的说法,破坏性操作是对分支的提交执行操作,从而产生替代历史。最常被引用的例子是 rebase 一个已经被推送并且可能被其他人拉取的分支。 git filter-branch
你的案例中使用的是另一个例子。
网络上有很多文章解释了为什么变基 public 分支不是一个好主意。 filter-branch
也是如此。其要点如下:
如果您更改提交 C 中的任何内容(包括创作信息),C 和任何以 C 作为祖先的提交都将收到一个新的哈希值。在最简单的情况下,比如说,我们有一个分支并重写了一些提交。现在分支无法推送到存储库,因为推送只能在顶部添加东西。但是重写创建了一个并行分支。跟老版本差不多没关系,重写创建了一个新的hash,这才是最重要的。
所以在 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'
如果你的开发人员很少,你可以这样解决这个问题:
- 告诉大家全力以赴,停止工作。
- 执行你的破坏性操作。
- 强制推送所有内容。
- 告诉大家拉。这将自动更新分支并为每个受影响的分支显示 "forced update" 指示器。
如果您有很多开发人员并且根本无法停止提交,我认为没有不会造成任何混乱的解决方案。这是您为整个存储库的完整性检查支付的(恕我直言)价格。