汞导入后git的修复

汞导入后git的修复,git,mercurial,Git,Mercurial,不久前,我将我的项目从自我托管的mercurial存储库转移到github 现在看来,我没有仔细检查导入过程的结果。我结束了一些没有父母的承诺 例如,查看提交。它没有父级,并且包含包含所有内容的所有文件,就像它将是初始提交一样。但是当我查看我的原始hg存储库时,这个提交应该有一个父级- 有没有办法重新分配无效的提交?我有时需要使用git Bull,但它现在给了我无用的结果。首先,如果您没有使用新的git存储库,并且仍然拥有原始的Mercurial存储库,那么您最好使用任何命令和/或选项重新转换,

不久前,我将我的项目从自我托管的mercurial存储库转移到github

现在看来,我没有仔细检查导入过程的结果。我结束了一些没有父母的承诺

例如,查看提交。它没有父级,并且包含包含所有内容的所有文件,就像它将是初始提交一样。但是当我查看我的原始hg存储库时,这个提交应该有一个父级-


有没有办法重新分配无效的提交?我有时需要使用git Bull,但它现在给了我无用的结果。

首先,如果您没有使用新的git存储库,并且仍然拥有原始的Mercurial存储库,那么您最好使用任何命令和/或选项重新转换,以获得正确的转换。那你就不必担心遗漏什么了

如果失败了,那么:

有没有办法重新分配无效的提交

有点,是的。但是也不要。考虑使用Git替换来进行初始修复,然后Git过滤器分支重写存储库,之后所有用户必须切换到重写的一个。 替代品 从根本上说,问题在于任何承诺都无法改变。可以将提交复制到一个新的、稍有不同的提交,该提交在其他方面与原始提交一样好,这是处理该问题的一种方法

Git能够使用替换提交或任何Git对象。这种隐藏的工作方式是,被替换的提交以其原始形式保持在存储库中,并且您可以创建一个新的替换对象,通常是通过复制但稍微更改原始对象(如果您愿意,也可以这样做)。此替换对象进入存储库,具有特殊的外部名称refs/replace/。每当Git通过哈希ID查找并使用原始对象时,它首先检查refs/replace/reference是否存在。如果是这样,Git将目光从原始对象转向替换对象。前端git replace命令使这个过程不那么痛苦,但有一个大警告:替换对象通常不会跨克隆传输。这包括初始克隆和获取操作

他们可以,这并不难,但这不是默认的。这是出于各种原因,特别是安全性。如果允许替换,则从PGP签名标记和/或提交中获得的任何安全性都将立即丢失。如果您可以直接访问存储库,以便可以运行git replace,那么您已经基本上独立于加密安全性;但是,如果你克隆或获取,你依赖它

滤波支路 git-filter-branch命令完全是关于复制提交的,并在过程中应用了一些更改过滤器。复制以某个分支名称或其他引用点所在的提交结束的某组提交后,filter branch命令将重写该引用以指向新复制的链

如果提交的副本与原始副本完全相同,则该副本实际上就是原始副本。仅以某种方式提交该更改会产生具有不同哈希ID的新副本。筛选器分支代码仍然会复制每个提交,但有些副本最终是免费的

考虑一下这个小小的四个提交存储库:

A--B--C--D   <-- master
如果您根本不指定过滤器,Git只会复制每个提交。如果使用-all-tagname过滤器cat,Git会将此过程应用于所有分支和所有标记。但这是复制使用替代品的关键。因此,让我们绘制您自己的存储库,包括不正确的提交fbf4e876f172e7a4a03153b801bd44cf71d98601让我们简称它为F,以及具有正确父级c1b215a3ae19dd9b6771a4ffe9217d6f9b65d4a9的替换F’,让我们简称它为C:

...--C--...  <-- refs/heads/somebranch
      \
       F'    <-- refs/replace/F

F            <--- tag: v2.0.0
commit F没有父级,所以它只是作为第二个根提交放在那里

现在,我们运行git replace-all-tagname过滤器cat,这样git就可以找到所有引用都可以访问的所有提交,包括refs/heads/somebranch和refs/tags/v2.0.0。所以它在C之前和之后复制提交,但对它们没有任何更改。它转到复制F,但切换到替换F',并复制F',而F'也没有变化

现在,它已经复制了除F之外的所有内容,并使名称refs/heads/somebranch和refs/tags/v2.0.0指向副本。这对somebranch没有影响,但使refs/tags/v2.0.0指向替换commit F'

过滤器分支代码添加refs/original/names以保留原始分支提示和标记的提交,因此将丢弃refs/original/refs/heads/somebranch和refs/original/refs/tags/v2.0.0

执行此操作的最简单方法通常是克隆筛选的存储库:此克隆不拾取refs/replace/references,也不拾取refs/original/references。它只获取refs/heads/和refs/t ags/参考资料。如果您不喜欢克隆方法,还有其他几种方法可以做到这一点。它们中的大多数将提交的额外副本留在存储库中至少30天,直到它们自然过期并被垃圾回收。如果您只是替换一些提交,那么这并不是什么大问题

...--C--...  <-- refs/heads/somebranch
      \
       F'    <-- refs/replace/F

F            <--- tag: v2.0.0