リモート追加な挙動について

昨日は github で動作確認してるんですが、某所でも試験のために git なホストを起動したのでそちらの動作確認も兼ねてもごもごしてみたんですが、非常に興味深い挙動が確認できたのでメモを残しておくことに。

したこと

remote add しました。

$ git remote add test git@172.16.0.1:git-flow-test.git

.git/config の一部が以下なカンジに。

[remote "origin"]
        url = git@github.com:yamanetoshi/git-flow-test.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[remote "test"]
        url = gitosis@172.16.0.1:git-flow-test.git
        fetch = +refs/heads/*:refs/remotes/test/*

これで master とか develop なブランチを test なリモートに push できます。

$ git push test develop
(成功
$ git push test master
(成功
$

では、ということで push した先から clone してみました。

$ git clone git@172.16.0.1:git-flow-test.git
Cloning into git-flow-test...
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (16/16), done.
Receiving objects: 100% (18/18), done.
Resolving deltas: 100% (5/5), done.
remote: Total 18 (delta 5), reused 0 (delta 0)
$

ブランチ確認。

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
$

まだ git flow init してないのでアレですが test なリモートから clone したのに origin になってるな、と言いつつ .git/config の中身を見てみたら以下。

$ cat .git/config
[core]  
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = gitosis@172.16.0.1:git-flow-test.git
[branch "master"]
        remote = origin
        merge = refs/heads/master
$

む、これは一体、と思ったら git clone が、というよりも .git/config が git の管理対象になっていないのであれば、clone 元が origin だわな、と。
ちなみに git branch の結果が以下。

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
$

この挙動、面白いと言えば良いのかはたまたヤッてることが微妙なのかは不明。

そして

git flow init してみたら .git/config が書きかえられた模様。

$ git flow init -d
Initialized empty Git repository in /home/rms/tmp/git/.git/
Using default branch names.
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master] 
Branch name for "next release" development: [develop] 

How to name your supporting branch prefixes?
Feature branches? [feature/] 
Release branches? [release/] 
Hotfix branches? [hotfix/] 
Support branches? [support/] 
Version tag prefix? [] 
$ git branch -a
* develop
  master
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[gitflow "branch"]
        master = master
        develop = develop
[gitflow "prefix"]
        feature = feature/
        release = release/
        hotfix = hotfix/
        support = support/
        versiontag = 
$

ということは clone してきた時には

  • git clone
  • git flow init -d
  • git remote add
  • git fetch origin
  • git merge (必要ないか

あ、ここで origin を、ってことでも良いのか。
て、それは良いとしてヤッてみました。

$ git remote add origin git@172.16.0.1:git-flow-test.git
$ git fetch origin
arning: no common commits
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 18 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (18/18), done.
From 172.16.0.1:git-flow-test
 * [new branch]      develop    -> origin/develop
 * [new branch]      master     -> origin/master
$ git branch -a
* develop
  master
  remotes/origin/develop
  remotes/origin/master
$

成程。