2012-11-02 18 views
2

我有一个情况,我有两个存储库历史已被复制和损坏(通过SVN的交互和迁移 - 不是我的选择)。我在同一个临时维护库中都有作为远程存储库的存储库。他们分享了几百次历史价值的承诺,然后这个“旧”的承诺在几个分支上继续增加几十次。我需要将“新”树快速转向旧的状态。然而,由于内容相同,尽管内容相同,但它们不被识别为同一棵树。git可以自动识别相同的提交(使用不同的哈希)

我想告诉git“这两个提交是相同的,尽管有不同的作者”(作者ID在翻译中混淆了)。如果可能的话,那么我真的很喜欢它是否可以遍历两个远程树,并为每个节点使用相同的内容进行关联。这意味着我可以手动在两者上标记“提交1”,并让其完成。否则,我将需要手动标记每个分歧的根源(不会太糟糕,但宁愿不要)。我尝试使用移植点,这几乎是我想要的 - gitk显示我想要的,但是当我将它推回到主(新)存储库时,它沿着几百个重复提交进行拖动。这也有点令人讨厌,因为我必须为尚未合并的子节点做这件事。

我发现https://stackoverflow.com/a/973403/372757,并认为它会工作:我只需要将旧提交重新绑定到新的存储库,每个分支一次。

无论如何,我仍然想知道我的原始请求是否可能。

+1

如果您希望能够推送该信息并将其用于远程回购,则需要'git replace'而不是'grafts'。 –

回答

3

git对什么是“相同的提交”会有一个非常严格的定义,可能与您的想法不符。为了相同的承诺,以下所有必须为真:

  1. 树中的每个文件将被提交必须是字节为字节等同于同一个文件中的承诺,将成为母公司(即当前的HEAD)
  2. 没有新文件,没有删除文件,没有重组 - 树必须完全匹配,因为树的SHA1取决于它所包含的文件和子树;如果在树中的所有叶子不同的是,顶层树的SHA1会有所不同
  3. 一模一样的作者和提交者的姓名和电子邮件值
  4. 一模一样的作者和提交日期
  5. 一模一样的电流HEAD的价值,这将成为新的父提交
  6. 完全相同的提交信息
  7. 我失踪

所有这些事情可能是一些其他的细节都直接或间接地用于为新提交生成SHA1哈希,因此提交将不会完全相同,除非它完全相同。

这就是说,我认为可能更重要的是,在生成新提交时,如果特定文件或树与数据库中已存在的对象的字节对于字节相同,因为另一个提交使这些事情处于完全相同的状态,那么新提交将指向那些已经存在的对象 - 它们不会再被存储。

如果只有作者信息在两个分支上不同(即不同的提交顺序,即使文件内容完全与另一个分支匹配),也可以使用git filter-branchgit rebase来重写分支,修复信息但是这会导致一组全新的提交(但是假设除了提交消息,时间或作者/提交者名称以外,所有树和文件对象都可以保持不变)。但请注意,如果其他工作(由您自己或其他人)已经建立在现有分支之外,则可能需要进行大量的清理工作才能进行此类更改。

+0

是的,我想我应该说这个有点不同 - 我知道那些要求,我想知道我是否可以“建议”它忽略3和4.我会给过滤器分支尝试看看是否会做到这一点。 – zebediah49

1

你的问题是重新定义提交相等。我认为你应该使用git cat-filegrep来过滤提交的相关信息。也许树线对于你来说已经足够了(比如git cat-file commit <COMMIT_ID> | grep "tree"),但是我认为也可以包含父树(不仅仅是提交的ID,因为它们会有所不同)。

一旦你有这个平等的功能,这将是git rev-list回购的问题,并做一些重复搜索他们,我认为。

相关问题