将一个分支从一个库复制到另一个库

4
我有两个 git 仓库需要保持同步,但不能同时访问。一个在工作上,一个在家里,无法进行网络连接。
如何处理这个简单的设置?
我尝试过以下方式:我有一个克隆体,它“知道”两个仓库,并存在于便携式硬盘上。
假设某人在“工作”上创建了一个新分支,并且我想将其传输到“家庭”仓库中。如何操作呢?
如果只执行 git pull,我会在我的克隆体上得到以下结果:
$ git branch --list --all
*master
origin/HEAD -> origin/master
origin/bugfix_component_condition_destruction_fail
origin/master
origin/remove_stoplist_copy_and_erase

问:这是否仅意味着我的本地克隆“知道”某处有这些列出的分支,而除了名为“主”的本地现有分支之外,我的克隆上没有真正的数据?

将主分支推送/拉取到两个存储库很容易。但是其他分支似乎在我的本地克隆中不存在。我必须将每个远程分支跟踪到我的克隆的本地分支,然后将其转移到另一个存储库吗?

问:是否有任何典型的方法来处理两个存储库,以使它们在提交将被推送到两个存储库时保持同步?

问:是否有技巧可以获取所有远程分支的信息和内容。

对于我来说,“克隆”存储库的含义有点神秘?它似乎不是真正的克隆,而只是一些元数据和主分支。这是正确的吗?

编辑:

如果我启动gitk --all,我会看到在该分支中进行的所有更改。这看起来分支的内容在克隆中。

但是如果我执行:

$git checkout -b remove_stoplist_copy_and_erase --track remotes/origin/remove_stoplist_copy_and_erase
error: Not tracking: ambiguous information for ref refs/remotes/origin/remove_stoplist_copy_and_erase
Switched to a new branch 'remove_stoplist_copy_and_erase'

所以我就这样做了:
$git checkout origin/remove_stoplist_copy_and_erase
$git checkout -b remove_stoplist_copy_and_erase

现在推送它:

$git push --set-upstream ex remove_stoplist_copy_and_erase

我担心必须为两个远程分支手动执行所有操作,以使它们保持同步。是否有一些“最佳实践”来完成这项工作?

4个回答

5
您可以使用捆绑包来实现。无需在便携硬盘上拥有完整的存储库。
让我们称它们为repo1repo2 在repo1中,您可以调用以下命令:
- $ git fetch <bundle2> 'refs/heads/*:refs/remotes/repo2/*' 从在repo2创建的捆绑文件导入更改 - $ git bundle create <bundle1> --all --not --remotes=repo2 创建一个捆绑包以发送到repo2
在repo2中,相应地执行以下操作:
- $ git fetch <bundle1> 'refs/heads/*:refs/remotes/repo1/*' - $ git bundle create <bundle2> --all --not --remotes=repo1 manpage 包含更多信息和示例。

1
这只是意味着我的本地克隆仓库“知道”某些列出的分支存在于某处,除了也存在于本地的名为“master”的分支以外,在我的克隆仓库上没有真正的数据吗?
Git 2.36(2022年第二季度)会给出提示,当无法建立分支跟踪关系时,因为来自多个远程仓库的提取 refspecs 重叠而无法确定。
请参见 commit e4921d8(2022年4月1日),作者为 Tao Klerks (TaoK)
(由 Junio C Hamano -- gitster -- 合并至 commit ba2452b, 2022年4月4日)

跟踪分支:在模糊的refspec错误中添加建议

签名作者:Tao Klerks

当我们评估要在分支上设置的跟踪信息,并发现要添加为跟踪分支的ref被映射到多个远程的fetch refspec下时,会引发错误“not tracking: ambiguous information for ref”。

当用户在他们的git config(man)中复制粘贴远程定义并忘记更改跟踪路径时,很容易发生这种情况。

在这种情况下添加建议,明确指出涉及哪些远程,并建议如何纠正情况。
还更新了一个测试,明确期望该建议。

git config现在在其手册页面中包括以下内容:

ambiguousFetchRefspec

当多个远程映射到相同的远程跟踪分支命名空间并导致分支跟踪设置失败时,显示建议。

建议:

There are multiple remotes whose fetch refspecs map to the remote tracking ref '<orig_ref>':
<remotes_advice.buf)>

This is typically a configuration error.

To support setting up tracking branches, ensure that
different remotes fetch refspecs map into different tracking namespaces.

0

A1:是的,您需要在克隆上执行git fetch --all以获取所有远程分支。

A2:有几种方法可以实现这一点,但它们都是程序性的(不是软件工程意义上的)。

A3:参见A1。


如果我执行了 git fetch --all,那么如何处理克隆(clone)呢?请查看我在问题中的编辑。你提供给 A2 的信息并不是很有帮助。“有几种方法”并不是回答如何做某事的问题。一种方法会对我有所帮助 :-) 在你的回答之前,我们已经知道有一种方法可以解决这个问题! - Klaus
@Klaus:我同意我的A2并不是一个有帮助的回答。做这件事的一种方法是使用补丁(对于链接到外部网站的道歉):https://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git/ - TriskalJM
我不确定你所说的“处理克隆”的意思是什么?克隆现在应该包含原始存储库的所有信息,因此您可以像对待远程一样对待它,只是您在克隆中进行的更改必须被推送。 - TriskalJM
在本地克隆中检出每个分支并将每个单独的分支推送到另一个远程分支是唯一的方法吗? - Klaus
如果你想要匹配所有的信息,那么是的。但这需要执行 git fetch --allgit push --all 命令。如果只针对特定分支,可以使用 git fetch <remote/branch> 或者 git push <remote/branch> 命令。 - TriskalJM
1
顺便说一句:git fetch --all 会查找所有仓库。但我一次只能访问一个仓库。 - Klaus

0

简单来说,将你的工作源添加到本地仓库:

  • git add origin-work [path-to-work-repo]

然后获取所有分支:

  • git fetch origin-work

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接