2016-11-17 6 views
1

私は、複数のサブモジュールを備えた十分な大きさのレポに取り組んでいます。我々はCI処理中に正しい状態にしていることを確認するために、我々は、サブモジュールを初期化のようなものをプリントアウトなぜ、 "git checkout origin/branch"が "origin at master/master"の代わりに "<SHA>にデタッチされました"という結果になるのですか?

$ git submodule init 
$ git submodule sync 
$ git submodule update --force 

Synchronizing submodule url for 'android/public' 
Synchronizing submodule url for 'ios/public' 
... 

Submodule path 'android/public': checked out 'asdf1234' 
Submodule path 'ios/public': checked out 'bsdf2345' 

私たちは、その後通過し、いくつかの異なるをチェックアウトした場合私たちは、その後

$ for platform in android ios 
$ do 
$ (cd $platform/public; git fetch --all; git checkout origin/master) 
$ done 

を実行し、git branchでこれらのフォルダをチェックすると枝が、それらはすべて(HEAD detached at origin/master)を言います。

しかし、我々は上部のサブモジュールの初期化をやり直し、そして

$ for platform in android ios 
$ do 
$ (cd $platform/public; git fetch --all; git reset --hard origin/master; git checkout origin/master) 
$ done 

を実行し、git branchで再びこれらをチェックすると、彼らは(HEAD detached at <some SHA>)として表示されます。それは変更することができるよう

これは、私たちのCIでのレガシー手順の一種であるが、私はまだorigin/masterで切り離さHEADを表示git branchgit checkout origin/masterなりません常に結果を実行している理由を知りたいのです。

答えて

3

"detached at"文字列は単なる情報提供の試みです。 Gitの古いバージョンでは、のみが使用され、ハッシュIDはで、「<で隔離されたハッシュ>」と表示されます。

Gitの新しいバージョンでは、取り外しを行ったgit checkoutコマンドのアイテムを覚えようとしています。できるだけ「detached at something_more_informative」と表示されます。ここにはdetached at origin/masterが表示されることがあります。現在のコミットを移動した場合(例えば、git checkoutを使って、または新しいコミットを行うなどして、新しいコミットIDをHEADに書き込むなど)、詳細を失うことになります。この場合、Gitのいくつかの新しいバージョンでは、 "detached at"の代わりに "detached from"と表示され、ハッシュIDであれ、名前であれ、何らかの追加情報があります。新しいバージョンのGitはこれをしようとしていますが、いくつかの小さなバグがあり、 "detached from"と "detached at"を適切に区別できません。

この特定の場合、それはだ-although Gitのバージョンに依存し、チャンスは理由が「ハッシュでデタッチ」であなたの最後の例のプロセスの結果与えられたにあなたのgit reset --hard origin/master移動し、IDによってコミット追い払ってくれるということであるということですあなたのgit checkout origin/masterは、これがの移動ではないことを確認します。つまり、既にであり、そのIDはです。したがって、保持されているハッシュまたは名前は更新されません。

そのような場合、その後のgit checkout(通常)の動きをしているので、単純に、git reset --hardgit reset --hard origin/masterを置き換え、バック名に保持されている情報を変更します。

+0

@torekの説明をいただきありがとうございます。私はハッシュを持っているだけの古いバージョンのgitについて言及したことに全く気づいたことはありません。そして、新しいバージョンでは「切り離された」と言われていますが、全体的には基本的にバグですね。私がどこから来たのかは問題ではありません。どこに行くの?私はそれが "分離された"状態であればこの状況を理解するだろうが、それが "離れたところ"になると、そのブランチに行くことができれば、それ以上の情報は必要ないはずである。 – seaders

+0

"detached at foo"から "fooから切り離されました"に進むという(主な)考えは、新しいコミット*を元のハッシュに追加しても、新しい匿名ブランチ。あなたがそれを離れた場合、このブランチはあなたが名前をつけない限り放棄されるので、あなたが今やこのやや危険な状態にあることを指摘することはいいことです。 – torek

+1

それは、はい、あなたが "ハッシュ"から "名前"に移動せずに切り替えると、生のハッシュを名前に置き換えるといいかもしれないと言っています。しかし、1つのコミットのために多くの名前があるかもしれません。記録されるべきものは 'git checkout'に与えられたものです:' git checkout origin/master'と 'git checkout v2.3'と同じコミットの場合、タグ:v2.3 "これをバグ*と呼ぶかどうかは、Gitの人たちの責任です。 – torek

関連する問題