git push -u origin branch
将分支与 origin / branch 绑定在一起,以便后续从分支推送可以只是git push
,据我所知
我可以在离线时为全新的回购设置(原产地/分支尚未存在)设置此类跟踪吗?我想这样做所以后来从 branch 推送到 origin / branch ,而不必在我上线时指定。
答案 0 :(得分:3)
好吧,让我们自己解决一些git
。
git
存储对远程分支的引用的位置在.git/refs/remotes/<remote_repo>
中。假设我们刚刚创建了一个新的repo,并添加了remote作为原点。然后我们离线并创建一个名为new_branch
的新分支。
如果您查看.git/refs/remotes/origin
,您应该看到:
decave@demo~$ls /home/decave/demo/.git/refs/remotes/origin
HEAD
那里没有分店;鉴于我们没有从远程仓库推或拉任何分支,这是预期的。现在,假设new_branch
指向带有哈希e81d5ea59b5f7ab81de4662f7dca5de86e230d92
的提交。如果我们将文件添加到名为.git/refs/remotes/origin
的{{1}}并将其内容设置为new_branch
,那么它就等于告诉您的本地回购“嘿,e81d5ea59b5f7ab81de4662f7dca5de86e230d92
是一个分支指向提交new_branch
“的原点。这可以使用e81d5ea59b5f7ab81de4662f7dca5de86e230d92
管道命令git
:
git update-ref
然后,如果你运行命令
git update-ref refs/remotes/origin/new_branch e81d5ea59b5f7ab81de4662f7dca5de86e230d92
它应该成功配置git branch --set-upstream-to origin/new_branch
以执行您想要的操作。
请注意,像这样开始围绕您自己的存储库进行管道是非常可怕的做法。实现这一目标的正确方法就是像你说的那样使用git
标志。
答案 1 :(得分:2)
我将xyz
用作分支的名称,并将origin
作为遥控器的名称以避免混淆。您已经提到 online 方法同时推送和设置上游..
git push --set-upstream origin xyz
首选方法是在离线前使用--set-upstream-to
git branch
git branch --set-upstream-to origin/xyz
选项获取分支,而无需推送设置上游。
.git/config
这导致将以下行添加到[branch "xyz"]
remote = origin
merge = refs/heads/xyz
,这也是之前描述的在线方式的结果。
.git/config
如果您不想先获取远程分支,可以手动编辑git config
或使用git config branch.xyz.remote origin
git config branch.xyz.merge refs/heads/xyz
工具执行相同的操作。
--set-upstream-to
然后,当您获取远程分支时,您应该已经获得与已经获取远程分支的git update-ref refs/remotes/origin/xyz xyz
git branch --set-upstream-to origin/xyz
相同的结果。
您可以通过将远程分支ref设置为特定提交来模拟脱机提取,例如:与当地分支机构进行相同的提交。
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ sudo apt-get install oracle-java8-set-default
直接参考更新的想法来自Decave的回答。谨慎使用并阅读有关快进/非快进提取的git-fetch(1)
注释。