49

私の理解では、クローンされたリポジトリのデフォルトのブランチは、クローンされたリポジトリで HEAD が指すものになるということです。

私は今、これが真実ではない場合を抱えています。私の理解には明らかに欠陥があるので、(ベア) レポを複製するときにデフォルトのチェックアウト ブランチを決定するのは何ですか?

そのレポの最後のコミットは、裸のレポの HEAD で参照されているブランチと、クローンのチェックアウト ブランチとして取得しているブランチとの間のマージでした。

ランニングgit remote show originリターン:

Fetch URL: ...
Push  URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
  <bad-branch>
  live
Remote branches:
  ...

ベア リポジトリは Git バージョン 1.8.2.1 を使用し、クライアントは 1.7.12.4 を使用し、トランスポートは SSH です。

たぶん、答えは実際にはこれです ここ. この答えはそれを確認します。すべてが HEAD と同じリビジョンを指しているシンボリック参照の選択肢がある場合、クライアントはどのブランチを使用するかを推測します。

4

5 に答える 5

34

Git 1.8.5から、サーバーは「 symref HEAD」機能で、指し示す実際のブランチ名を送信します。クライアントとサーバーの両方が Git 1.8.5 よりも新しい場合、HEAD 正しく更新されます。

その前に、クライアントは、HEAD が (最終的に) 指すオブジェクト ID をすべてのブランチのすべてのオブジェクト ID と比較することによって、HEAD が指している可能性があるものを推測します。という名前のブランチを優先しrefs/heads/masterます: と の両方が同じオブジェクト IDHEADmaster指している場合、クローンは新しいリポジトリのデフォルトのブランチを に設定しますmaster

それ以外の場合は、OID が一致する最初のブランチ (ブランチが英数字でソートされている場合) がデフォルトのブランチになります。一致する OID を持つブランチがない場合はHEAD、オブジェクト ID (つまり、切り離された HEAD) に直接設定されます。

于 2015-09-10T13:46:20.367 に答える
3

ですorigin/HEAD。ただし、「origin/master」のような名前が必要な場合は、次のようにファイルを解析する必要があります

cat .git/refs/remotes/origin/HEAD | awk '{ print $2 }'
于 2019-09-14T14:42:56.300 に答える