Skip to content

Instantly share code, notes, and snippets.

@mtilson
Last active April 13, 2020 08:57
Show Gist options
  • Save mtilson/590efc0cfaab7437351fca9454907a01 to your computer and use it in GitHub Desktop.
Save mtilson/590efc0cfaab7437351fca9454907a01 to your computer and use it in GitHub Desktop.
what useful refs are inside '.git' directory, part 1 - cloned (non-bare) repo [git]

We have only one remote

  • $ git remote
origin

Directory structure

  • $ tree -L 1 .git
.git
├── COMMIT_EDITMSG
├── FETCH_HEAD
├── HEAD
├── ORIG_HEAD
├── config
├── description
├── hooks
├── index
├── info
├── logs
├── objects
├── packed-refs
└── refs

'refspecs'

  • 'refspecs' are both in .git/packed-refs file
    • $ cat .git/packed-refs
# pack-refs with: peeled fully-peeled sorted
bb2e4197f7a43a657679aaa0431074a4c5243a34 refs/remotes/origin/gf
bb2e4197f7a43a657679aaa0431074a4c5243a34 refs/remotes/origin/greate-feature
50b3ba9f8277e04b55553b2968ff3c83c8ef1453 refs/remotes/origin/master
ce46a4519061e27250e1284523d8b3275f07248b refs/remotes/origin/user/feature10
0b2f912cc59f06cde211fab3d2e505120656edee refs/remotes/origin/user/feature13
6cf4610fc2b4aaa18002f3592a5cbe1161cab196 refs/remotes/origin/user/feature14
44eac6ac98c3c7bde5a183418ed16dee87540b57 refs/tags/v0.0.1
dfcad2cba1f1550900941d52698abf98e166c10f refs/tags/v0.0.2
6cc157a6219262b8f454db5701e2b4a7af6ec6b8 refs/tags/v0.0.3
d9de8d804d5f93ca9a757997758c15d7c12dfbfe refs/tags/v0.0.4
^f96c6c3ebc5819cf7561acd6c439b5989522765a
876b83ed8fe60e9db0d543d0b9a32c630565abc3 refs/tags/v0.0.5
^429f925d2c6476bd5cb0245417b304b37a366439
685234a3ba1e408df54d1ce5a9836df95346ae81 refs/tags/v0.0.6
^06023bee3f84cf4274c368b84a53917521972e4d
  • and in .git/refs/ directory
    • $ for i in $(find .git/refs -type f); do echo -n $(cat $i); echo " $i" | sed -e 's#.git/##' ; done
a11074212323a2bed2b11c31cd232fa8d03862f4 refs/heads/user/feature19
2ca50b0c10fff54b9a1c7a833940b3a15a77a47c refs/heads/user/feature20
16600c85005bc95c4933125394b79de03d4a9e02 refs/heads/master
a11074212323a2bed2b11c31cd232fa8d03862f4 refs/remotes/origin/user/feature19
2ca50b0c10fff54b9a1c7a833940b3a15a77a47c refs/remotes/origin/user/feature20
f2fd57156013d612afc8a5d0c2659eed42ae8906 refs/remotes/origin/user/feature18
ref: refs/remotes/origin/master          refs/remotes/origin/HEAD
16600c85005bc95c4933125394b79de03d4a9e02 refs/remotes/origin/master
  • see how .git/refs/* overwrites .git/packed-refs for refs/remotes/origin/master 'refspec'

Local branches correspond to refs/heads/* and are 'refspecs' configured for git push

  • $ git br -vv
* master         16600c8 [origin/master] Merge pull request #17 from txxxx-xx/user/feature17
  user/feature19 a110742 [origin/user/feature19] feature19
  user/feature20 2ca50b0 feature20
  • $ git remote show origin
...
  Local refs configured for 'git push':
    master         pushes to master         (up to date)
    user/feature19 pushes to user/feature19 (up to date)
    user/feature20 pushes to user/feature20 (up to date)
...

Local remote-tracking branch correspond to refs/remotes/origin/* (origin is remote)

  • $ git br -rv
  origin/HEAD           -> origin/master
  origin/gf             bb2e419 greate-feature
  origin/greate-feature bb2e419 greate-feature
  origin/master         16600c8 Merge pull request #17 from txxxx-xx/user/feature17
  origin/user/feature10 ce46a45 feature10
  origin/user/feature13 0b2f912 Merge pull request #13 from txxxx-xx/user/feature13
  origin/user/feature14 6cf4610 feature14
  origin/user/feature18 f2fd571 user_feature18
  origin/user/feature19 a110742 feature19
  origin/user/feature20 2ca50b0 feature20

Repo configuration is in .git/config

  • $ cat .git/config
...
[remote "origin"]
	url = https://github.com/txxxx-xx/gxx-xxxx.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
[branch "user/feature19"]
	remote = origin
	merge = refs/heads/user/feature19
...

Local tracking branches (user/feature19 and master) set up in .git/config to track corresponding remote branches (for git pull) with help of branch.<name>.merge

  • $ cat .git/config
...
[branch "master"]
	remote = origin
	merge = refs/heads/master
[branch "user/feature19"]
	remote = origin
	merge = refs/heads/user/feature19
...
  • $ git br -vv
...
* master         16600c8 [origin/master] Merge pull request #17 from txxxx-xx/user/feature17
  user/feature19 a110742 [origin/user/feature19] feature19
...
  • $ git remote show origin
...
  Local branches configured for 'git pull':
    master         merges with remote master
    user/feature19 merges with remote user/feature19
...

Local remote-tracking branches (user/feature10 and user/feature18) are present in refs/remotes/origin/*, but absent in remote repo, and declared as stale by git remote show

  • $ cat .git/packed-refs
...
ce46a4519061e27250e1284523d8b3275f07248b refs/remotes/origin/user/feature10
...
  • $ for i in $(find .git/refs -type f); do echo -n $(cat $i); echo " $i" | sed -e 's#.git/##' ; done
...
f2fd57156013d612afc8a5d0c2659eed42ae8906 refs/remotes/origin/user/feature18
...
  • $ git ls-remote
From https://github.com/txxxx-xx/gxx-xxxx.git
16600c85005bc95c4933125394b79de03d4a9e02	HEAD
bb2e4197f7a43a657679aaa0431074a4c5243a34	refs/heads/gf
bb2e4197f7a43a657679aaa0431074a4c5243a34	refs/heads/greate-feature
16600c85005bc95c4933125394b79de03d4a9e02	refs/heads/master
0b2f912cc59f06cde211fab3d2e505120656edee	refs/heads/user/feature13
6cf4610fc2b4aaa18002f3592a5cbe1161cab196	refs/heads/user/feature14
a11074212323a2bed2b11c31cd232fa8d03862f4	refs/heads/user/feature19
2ca50b0c10fff54b9a1c7a833940b3a15a77a47c	refs/heads/user/feature20
...
  • $ git remote show origin
...
  Remote branches:
    gf                                 tracked
    greate-feature                     tracked
    master                             tracked
    refs/remotes/origin/user/feature10 stale (use 'git remote prune' to remove)
    refs/remotes/origin/user/feature18 stale (use 'git remote prune' to remove)
    user/feature13                     tracked
    user/feature14                     tracked
    user/feature19                     tracked
    user/feature20                     tracked
...

Local tag 'refspecs' (refs/tags/*) correspond to remote ones (refs/tags/*) both for 'lightweight' (v0.0.1, v0.0.2, v0.0.3) and 'annotated' (v0.0.4, v0.0.5, v0.0.6) tags (local: ^ == remote: ^{})

  • $ cat .git/packed-refs
...
44eac6ac98c3c7bde5a183418ed16dee87540b57 refs/tags/v0.0.1
dfcad2cba1f1550900941d52698abf98e166c10f refs/tags/v0.0.2
6cc157a6219262b8f454db5701e2b4a7af6ec6b8 refs/tags/v0.0.3
d9de8d804d5f93ca9a757997758c15d7c12dfbfe refs/tags/v0.0.4
^f96c6c3ebc5819cf7561acd6c439b5989522765a
876b83ed8fe60e9db0d543d0b9a32c630565abc3 refs/tags/v0.0.5
^429f925d2c6476bd5cb0245417b304b37a366439
685234a3ba1e408df54d1ce5a9836df95346ae81 refs/tags/v0.0.6
^06023bee3f84cf4274c368b84a53917521972e4d
...
  • $ git ls-remote
...
44eac6ac98c3c7bde5a183418ed16dee87540b57	refs/tags/v0.0.1
dfcad2cba1f1550900941d52698abf98e166c10f	refs/tags/v0.0.2
6cc157a6219262b8f454db5701e2b4a7af6ec6b8	refs/tags/v0.0.3
d9de8d804d5f93ca9a757997758c15d7c12dfbfe	refs/tags/v0.0.4
f96c6c3ebc5819cf7561acd6c439b5989522765a	refs/tags/v0.0.4^{}
876b83ed8fe60e9db0d543d0b9a32c630565abc3	refs/tags/v0.0.5
429f925d2c6476bd5cb0245417b304b37a366439	refs/tags/v0.0.5^{}
685234a3ba1e408df54d1ce5a9836df95346ae81	refs/tags/v0.0.6
06023bee3f84cf4274c368b84a53917521972e4d	refs/tags/v0.0.6^{}
...

Other interesting stuff

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment