Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detailed explanation of 'git remote show'

I honestly cannot find any detailed documentation of the output of git remote show (certainly not on the man page)

In particular, a clear, exact explanation of the Local sections would be appreciated.

An example of what I find confusing:

Here I have two remotes, klas and origin and the output they produce:

> git remote show klas
* remote klas
  Fetch URL: ..\klasrepo
  Push  URL: ..\klasrepo
  HEAD branch: master
  Remote branches:
    experiment  tracked
    feature     tracked
    master      tracked
    pu          tracked
    stashbranch tracked
  Local branch configured for 'git pull':
    pu merges with remote pu
  Local refs configured for 'git push':
    experiment pushes to experiment (fast-forwardable)
    feature    pushes to feature    (fast-forwardable)
    master     pushes to master     (fast-forwardable)
    pu         pushes to pu         (up to date)
> git remote show origin
* remote origin
  Fetch URL: C:/Temp/git/.\barerepo.git
  Push  URL: C:/Temp/git/.\barerepo.git
  HEAD branch: experiment
  Remote branches:
    experiment tracked
    master     tracked
  Local branches configured for 'git pull':
    experiment  merges with remote experiment
    master     rebases onto remote master
  Local refs configured for 'git push':
    experiment pushes to experiment (up to date)
    master     pushes to master     (fast-forwardable)

Notice that experiment and master are listed under both local refs configured for 'git push'. What does that mean? I have configured master and experiment to track origin/master and origin/experiment respectively (and pu to track klas/pu).

My local feature branch is not set up to track anything, but is still listed under local refs configured for 'git push' (the only connection seems to be the identical name, another non-tracking branch, foo, is not mentioned). git push while on feature gives fatal: The current branch feature has no upstream branch. - hardly "fast-forwardable".

It seems that the criteria for a local branch being listed under local refs configured for 'git push' is that there happens to exist a remote branch with the same name??

For reference:

> git branch -vva
  experiment                0cf7b2a [origin/experiment] added rand content 82 to .\rand_content.txt
* feature                   4b25f46 added rand content 62 to bar.txt
  foo                       40aee50 added rand content 17 to .\rand_content.txt
  master                    4b25f46 [origin/master] added rand content 62 to bar.txt
  pu                        44ad10b [klas/pu] added rand content 51 to doo.txt
  remotes/klas/experiment   1f4e89b app
  remotes/klas/feature      884e953 added rand content 80 to bar.txt
  remotes/klas/master       57877c1 added in tobias repo
  remotes/klas/pu           44ad10b added rand content 51 to doo.txt
  remotes/klas/stashbranch  8678cf0 added rand content 44 to .\rand_content.txt
  remotes/origin/HEAD       -> origin/master
  remotes/origin/experiment 0cf7b2a added rand content 82 to .\rand_content.txt
  remotes/origin/master     4b25f46 added rand content 62 to bar.txt
> git config --list --local | select-string 'branch|remote'
remote.origin.url=C:/Temp/git/.\barerepo.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.master.rebase=true
remote.klas.url=..\klasrepo
remote.klas.fetch=+refs/heads/*:refs/remotes/klas/*
branch.experiment.remote=origin
branch.experiment.merge=refs/heads/experiment
branch.pu.remote=klas
branch.pu.merge=refs/heads/pu
> git --version
git version 1.8.1.msysgit.1
like image 510
Klas Mellbourn Avatar asked Mar 25 '13 22:03

Klas Mellbourn


1 Answers

This appears to be a bug in Git 1.8.1.

Skimming the Git source code (specifically remote.c and builtin/remote.c), the list under "Local refs configured for 'git push'" is calculated as follows:

  1. collect configured push refspecs:
    • read .git/remotes/<remotename> (an obsolete config file; see git help repository-layout)
    • read .git/branches/<branchname> (another obsolete config file)
    • examine the remote.<remotename>.push config item
  2. if step #1 didn't find anything, use : as the only push refspec
  3. find all {local, remote} branch combinations that matched the collected push refspecs

Note that the above algorithm doesn't pay attention to branch.<branchname>.remote, branch.<branchname>.merge, or push.default.

Under typical usage patterns, step #1 in the above algorithm will never find any configured refspecs so : will be used. That refspec is a simple matching refspec, so with typical usage git remote show <remotename> will always print <branchname> pushes to <branchname> if there is a branch named <branchname> in both the local and remote repositories.

like image 100
Richard Hansen Avatar answered Sep 30 '22 16:09

Richard Hansen