18

我有一个 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 始终保留这两个远程别名?

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

目标是在我的 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

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

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

4

3 回答 3

14

那是不可能的。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

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

于 2013-03-08T04:24:25.097 回答
5

创建一个 .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
}

[以上内容并不是那么复杂;但说明了重点和工作]

于 2013-03-08T04:00:54.607 回答
1

这是 GoZoner 解决方案的略微修改版本。

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

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

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

[include]
    path            = /dir1/dir2/repo-remotes.gitinfo
于 2013-03-08T05:31:26.410 回答