Git: which is the default configured remote for branch?
I have a remote bare repository hub
. I work only in the master
branch.
The last sentence of this error message below makes me wonder: How do I find out which is the "default configured remote for your current branch"? And how do I set it?
[myserver]~/progs $ git remote -v
hub ~/sitehub/progs.git/ (fetch)
hub ~/si开发者_JAVA百科tehub/progs.git/ (push)
[myserver]~/progs $ git branch -r
hub/master
[myserver]~/progs $ cat .git/HEAD
ref: refs/heads/master
[myserver]~/progs $ git pull hub
You asked to pull from the remote 'hub', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.
You can do it more simply, guaranteeing that your .gitconfig
is left in a meaningful state:
Using Git version v1.8.0 and above
git push -u hub master
when pushing, or:
git branch -u hub/master
OR
(This will set the remote for the currently checked-out branch to hub/master
)
git branch --set-upstream-to hub/master
OR
(This will set the remote for the branch named branch_name
to hub/master
)
git branch branch_name --set-upstream-to hub/master
If you're using v1.7.x
or earlier
you must use --set-upstream
:
git branch --set-upstream master hub/master
Track the remote branch
You can specify the default remote repository for pushing and pulling using git-branch’s track option. You’d normally do this by specifying the --track option when creating your local master branch, but as it already exists we’ll just update the config manually like so:
Edit your .git/config
[branch "master"]
remote = origin
merge = refs/heads/master
Now you can simply git push and git pull.
[source]
For the sake of completeness: the previous answers tell how to set the upstream branch, but not how to see it.
There are a few ways to do this:
git branch -vv
shows that info for all branches. (formatted in blue in most terminals)
cat .git/config
shows this also.
For reference:
- how do I get git to show me which branches are tracking what?
- What is this branch tracking (if anything) in git?
The programmatic version of the answer to this question is:
git branch --list "$(git branch --show-current)" "--format=%(upstream:remotename)"
This will output just the current branch's default remote name. The --show-current
option will not work before Git version 2.22.0.
Git: which is the default configured remote for a branch?
For a branch named branch_name
, read it out with this:
git config branch.branch_name.remote
Details
You can programmatically read out any given branch's locally-stored remote-tracking remote name via git config branch.branch_name.remote
.
Assume that you have a branch named main
and its remote it tracks is set to origin
. In that case, your .git/config
file will contain this, among other things:
[branch "main"]
remote = origin
merge = refs/heads/main
Running this:
git config branch.main.remote
...will therefore read out that configuration setting and return remote
.
You can use these patterns to programmatically read or write any git config variable, even ones you invent or make up yourself.
Example: this command: git config --global blametool.editor subl
adds these lines to the bottom of your global ~/.gitconfig
file:
[blametool]
editor = subl
And you can read out that variable value, subl
, with: git config blametool.editor
.
That's how I set a blametool for my git blametool
script.
the command to get the effective push remote for the branch, e.g., master, is:
git config branch.master.pushRemote || git config remote.pushDefault || git config branch.master.remote
Here's why (from the "man git config" output):
branch.name.remote [...] tells git fetch and git push which remote to fetch from/push to [...] [for push] may be overridden with remote.pushDefault (for all branches) [and] for the current branch [..] further overridden by branch.name.pushRemote [...]
For some reason, "man git push" only tells about branch.name.remote (even though it has the least precedence of the three) + erroneously states that if it is not set, push defaults to origin - it does not, it's just that when you clone a repo, branch.name.remote is set to origin, but if you remove this setting, git push will fail, even though you still have the origin remote
精彩评论