【问题标题】:How to make git repo remember all remotes?如何让 git repo 记住所有遥控器?
【发布时间】:2013-02-23 13:02:54
【问题描述】:

我有一个 git repo,它是另一个 repo 的一个分支。作为一项规则,我通常会添加一个名为 upstream 的远程,这是我派生出来的原始仓库。

$ git remote -v
origin git@github.com:skela/awesomeproject.git (fetch)
origin git@github.com:skela/awesomeproject.git (push)
upstream git://github.com/bob/awesomeproject.git (fetch)
upstream git://github.com/bob/awesomeproject.git (push)

有没有办法让这个额外的远程在克隆之间持久存在? 假设我删除了本地存储库并执行以下操作:

git clone git@github.com:skela/awesomeproject.git

现在我重新检查我的遥控器:

$ git remote -v
origin git@github.com:skela/awesomeproject.git (fetch)
origin git@github.com:skela/awesomeproject.git (push)

我的上游遥控器消失了!

如何确保我的 git repo 始终保留这 2 个远程别名?

编辑: 只是添加我想要这样做的主要原因,以便将一些答案塑造成可接受的路径;)

目标是在我的 repo 中有一个分支来跟踪上游的 master。

[remote "upstream"]
    url = git://github.com/bob/awesomeproject.git
    fetch = +refs/heads/*:refs/remotes/upstream/*
[branch "father"]
    remote = upstream
    merge = refs/heads/master

换句话说,我的仓库中的“父亲”分支跟踪称为上游主分支的远程分支。

一旦我设置它一切都很好,但是一旦我再次克隆回购,“父亲”分支指向原点而不是上游。

【问题讨论】:

标签: git github git-clone git-remote


【解决方案1】:

那是不可能的。 Git 只克隆 repo 的内容,而不是它的设置。如果您想将遥控器硬连线到您的仓库中(这是否是一个好主意值得怀疑),请在您的仓库根目录中创建一个脚本repo-setup.sh,执行如下操作:

git remote rm origin
git remote rm upstream
git remote add origin git@github.com:skela/awesomeproject.git
git remote add upstream git://github.com/bob/awesomeproject.git

然后在克隆存储库后运行此文件。

【讨论】:

  • 子模块信息很好,那么为什么不应该使用遥控器呢?我并不是说应该保留所有遥控器,但是将上游遥控器添加到 fork 是很常见的事情,肯定必须有适当的 git 方法来做到这一点?
  • 不,绝对不是。子模块信息也没有完全克隆——只有.gitmodules 文件。子模块的真实远程存储在.git/config,也没有被克隆。
  • 带有子模块,克隆后只需要执行2个git命令,那么你知道遥控器有没有类似的东西? git remote init 和 git remote update 似乎不存在:P
  • 看看 GoZoner 的回复。使用这个你需要运行:git clone.gitremotes >> .git/config。或者我的建议需要:git clone./repo-setup.sh
  • 如果其他人遇到这种情况,我已经接受了 GoZoner 的建议来复制我想要的远程信息。还有 Chronial 在上面的评论中的建议。基本上我最终不得不这样做: git clone git@github.com:skela/awesomeproject.git , cat .gitremotes >> .git/config
【解决方案2】:

创建一个 .gitremotes 文件,使用与遥控器相关的 .git/config 内容填充该文件。将 .gitremotes 添加到存储库。克隆后附加 .git/config 和 .gitremotes。注意:如果您要共享的遥控器(在 .gitremotes 中)与“git clone”自动创建的遥控器(“orgin”)有名称冲突,可能需要手动编辑。

要轻松完成此任务,您可以定义一个 bash 函数:

function git-clone-r ()
{
  src=$1
  tgt=$2
  git clone $src $tgt
  cat ${tgt}/.gitremotes >> ${tgt}/.git/config
}

[以上内容并没有那么复杂;但说明了要点和工作]

【讨论】:

  • 我使用此脚本github.com/juanpabloaj/git-remote-init 使用 .gitremotes 文件保存和恢复远程存储库
  • @juanpablo 不错的脚本。我注意到它假设没有遥控器,如果已经定义了遥控器,则退出。您通常会绕过克隆存储库时设置的默认远程“来源”吗?否则,这当然会在克隆后存在并且不做任何特殊/非标准的操作,您的脚本将静默返回。只是对这里的工作流程感到好奇。
【解决方案3】:

这是对 GoZoner 解决方案稍作修改的版本。

你需要从你的 repo 的.git/config 中捕获所有远程的信息到你可以存储在你的 git 存储库之外的一个文件中。每次添加新遥控器时,您还需要注意更新此文件。这实际上可以添加到您的 git 存储库中,以便下一次克隆或拉取此文件。

git 1.7.10+开始,git支持包含外部配置文件。

因此,您可以将以下行添加到您的 repo 的 .git/config 以包含包含远程信息的外部配置文件:

[include]
    path            = /dir1/dir2/repo-remotes.gitinfo

【讨论】:

  • 我可以理解将文件保留在存储库之外的原因,但我认为这会使我在这里尝试实现的目标无效。本质上,我想添加一个跟踪这个上游遥控器的分支,但是当我将它添加到组合中时,问题变得太复杂了。
  • Tuxdude:你知道我是否例如将 .gitconfig 或 .gitremotes 文件添加到我的 repo,然后将 [include] path=".gitconfig or .gitremotes" 添加到 .git/config ,这会在克隆中持续存在吗?
  • @Skela - 理论上它应该可以工作。但是在每次克隆之后,您至少需要更新包含路径以包含此文件。
  • 好吧,比 GoZoner 的解决方案略好,但仍然不理想。我要查看 git 的发行说明。也许它已添加到较新的版本中?
  • 好吧,我不明白这个...我在 .git/config 中有两个来源,并且项目被推送到两个来源,但是当我从其中一个来源克隆时,它 失去了这个 不知何故!
猜你喜欢
  • 2011-01-15
  • 2013-07-05
  • 2014-06-20
  • 1970-01-01
  • 2014-10-28
  • 2010-12-07
  • 2012-09-06
  • 2023-04-03
相关资源
最近更新 更多