我有一个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始终保留这两个远程别名?
编辑: 只是添加我想要这样做的主要原因,以便在可接受的路径上塑造一些答案;)
目标是在我的仓库中设立一个跟踪上游主人的分支。
[remote "upstream"]
url = git://github.com/bob/awesomeproject.git
fetch = +refs/heads/*:refs/remotes/upstream/*
[branch "father"]
remote = upstream
merge = refs/heads/master
换句话说,在我的仓库中的分支“父亲”跟踪称为上游主分支的远程。
一旦我设置它,一切都很好,但是一旦我再次克隆了回购,“父”分支指向原点而不是上游。
答案 0 :(得分:11)
这是不可能的。 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
克隆存储库后运行此文件。
答案 1 :(得分:3)
创建一个文件.gitremotes,使用与遥控器相关的.git / config内容填充。将.gitremotes添加到存储库。克隆后使用.gitremotes附加.git / config。注意:如果要共享的遥控器(在.gitremotes中)与“git clone”自动创建的遥控器('orgin')存在名称冲突,则可能需要进行一些手动编辑。
要轻松完成此任务,您可以定义一个bash函数:
function git-clone-r ()
{
src=$1
tgt=$2
git clone $src $tgt
cat ${tgt}/.gitremotes >> ${tgt}/.git/config
}
[以上并不是那么复杂;但说明了要点和作品]
答案 2 :(得分:1)
这是GoZoner解决方案的略微修改版本。
您需要将有关所有遥控器的信息从您的repo的.git/config
捕获到您可以存储在git存储库之外的文件中。每次添加新遥控器时,您还需要注意更新此文件。事实上,这可以添加到你的git repo中,这样下一个克隆或pull就会引入这个文件。
从git 1.7.10+
开始,git支持包含外部配置文件。
因此,您可以将以下行添加到repo的.git/config
,以包含包含远程信息的外部配置文件:
[include]
path = /dir1/dir2/repo-remotes.gitinfo