我有一种情况,我有两个存储库历史记录被复制和破坏(通过SVN的交互和迁移 - 不是我的选择)。我在同一个临时维护存储库中有两个存储库作为远程控制器。他们分享了几百个有关历史的提交,然后“旧”的一个继续在几个分支上再打几十个。我需要将“新”树快进到旧的状态。然而,由于内容相同,尽管内容相同,但它们并不被认为是同一棵树。
我想告诉git“这两个提交是相同的,尽管有不同的作者”(作者ID在翻译中很困惑)。如果可能的话,我会非常喜欢它是否可以遍历两个远程树并为每个具有相同内容的节点建立关联。这意味着我可以在两者上手动标记“提交1”,然后让它完成剩下的工作。否则我需要手动标记每个分歧的根(不会太糟糕,但不愿意)。
我尝试使用移植点,这几乎是我想要的 - gitk显示我想要的东西,但是当我将它推回到主(新)存储库时,它拖动了几百次重复提交。这样做有点烦人,因为我必须为一个尚未合并的子节点做这件事。
我找到https://stackoverflow.com/a/973403/372757,并认为它会起作用:我只需要将旧提交重新绑定到新存储库,每个分支一次。
尽管如此,我仍然想知道我的原始请求是否可行。
答案 0 :(得分:3)
git
对“相同提交”的定义非常严格,可能与您的想法不符。为了成为相同的提交,以下所有内容必须为真:
所有这些都直接或间接地用于为新提交生成SHA1哈希,因此提交将不相同,除非它真正相同。
那说,我认为可能更多的问题,在生成新提交时,如果特定文件或树是逐字节的,与数据库中已有的对象相同,因为另一个如果那些事情处于完全相同的状态,那么新的提交将指向那些已经存在的对象 - 它们将不再被存储。
如果只有作者信息在两个分支中不同(这将是不同的提交序列,即使文件内容完全与另一个分支匹配),您也可以使用git filter-branch
或git rebase
来重写一个分支,随时修复信息,但这将导致一组全新的提交(但是所有的树和文件对象都可能保持不变,假设除了提交消息之外没有更改任何内容,时间,或作者/提交者姓名)。但请注意,如果其他工作(由您自己或其他人)已经基于现有分支,则可能需要进行大量的清理才能进行此类更改。
答案 1 :(得分:1)
您的问题是重新定义提交相等性。我认为您应该使用git cat-file
和grep
来过滤提交的相关信息。也许树线对你来说足够了(比方说,git cat-file commit <COMMIT_ID> | grep "tree"
),但我认为包括父树的也是好的(不仅仅是提交的ID,因为它们会有所不同)。
一旦你拥有了这个平等功能,我认为git rev-list
你的回购,并对它们做一些重复搜索是我的事。