嫁接存在于refs/replace/ 层次结构中。 (或者,最好说“它们的存在归功于”此类引用。)要将它们从一个存储库转移到另一个存储库,您必须推送或获取此类引用。
例如:
git push origin refs/replace/5c714d7798d1dc9c18d194fa6448680515c0ccdb
当提交 5c714d7798d1dc9c18d194fa6448680515c0ccdb 有替换时(在我的情况下,替换是新的提交对象 ceba978ce6dad3b52d12134f4ef2720c5f3a9002,即,Git 通常不会“看到”5c714d7,而是寻找替换对象 ceba978)。
推送所有替换:
git push origin 'refs/replace/*:refs/replace/*'
(有时需要使用引号来防止 shell 破坏星号;确切地说,何时以及使用哪种 引号在某种程度上取决于 shell,尽管单引号和双引号都适用所有 Unix-y shell)。
获取替换的注意事项
如果某些远程 R 有替换,并且您希望将它们的所有替换到您的存储库中,请使用 git fetch <em>R</em> 'refs/replace/*:refs/replace/*'(或者如果您希望替换它们,则使用前缀 + 覆盖任何你已经拥有的)。您可以为任何给定的存储库和远程自动执行此操作。例如,如果您运行git config --edit,您会发现现有的origin 遥控器有几个如下所示的设置:
[remote "origin"]
url = ...
fetch = +refs/heads/*:refs/remotes/origin/*
只需添加一行:
fetch = refs/replace/*:refs/replace/*
或:
fetch = +refs/replace/*:refs/replace/*
让你的 Git 带上他们的 Git 的refs/replace/*。 (注意:这里不需要引号,因为 shell 不会处理这一行。)前导加号与往常一样具有相同的含义:1 没有它,如果你已经有 一些参考,你保留你的并忽略他们的。使用前导加号,您丢弃您的并改用他们的。与标签一样,如果您的参考和他们的参考已经匹配,那么您是保留自己的还是用他们的替换您的都没有关系;这仅在您对某个引用应该命名的对象有不同的想法时才重要。
1实际上,加号前导的“通常含义”取决于引用是否应该移动,例如分支名称,或者不 应该移动,例如标签名称。加号设置强制标志,即“始终采用建议的新设置”,但对于预期会“向前”的分支名称 - 当且仅当时才允许无强制更新这是一个“前进”(或“快进”)移动。 Git 最初也将此规则应用于其他引用,如标签,但 Git 人员在 Git 1.8.2 中修复了它。我不清楚 Git 适用于 refs/replace/ 引用的哪些规则,它们不应该移动,但不会像标签那样特别处理。