gitシャロークローン(clone --depth)がリモートブランチを検出しない


98

リモートリポジトリのクローンを作成した後、-aオプションを指定してもリモートブランチは表示されません。何が問題でしょうか?デバッグする方法は?このスニペットでは、2つのリモートブランチは表示されていません。

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
$ cd pythonwebkit
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git --version
git version 1.8.3.1

別のマシンで同じコマンドを試してみましたが、うまくいきます:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
Receiving objects: 100% (186886/186886), 818.91 MiB | 3.44 MiB/s, done.
$ cd pythonwebkit/
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/debian
  remotes/origin/master
  remotes/origin/python_codegen
$ git --version
git version 1.7.1

別のレポのクローンも作成しようとしましたが、うまくいきます。このマシンでもう一度試すことはできますが、何が問題なのかを知った方がよいでしょう。

どんな提案やヒントも大歓迎です。

編集:回答の概要:gitバージョン1.8.3.2以降、「-depth」と「--no-single-branch」を一緒に使用して、以前と同じ動作にする必要があります。これはバグ修正と見なされます。


3
masterあなたの地元の支店です。remotes/origin/master対応するリモートブランチです。質問は正確には何ですか?
michas 2014年

1
おそらく冗長性を忘れましたか?試してみるgit branch -avv
jthill、2014年

マイカなどへ:混乱のため申し訳ありませんが、通常はマスターをブランチと呼びません。「2つのリモートブランチは表示されません」が追加されました。jthillへ:思い出させてくれてありがとう、あなたは正しいです。
明華2014年

1
を紹介していただきありがとうございますgit clone --depth=1 --no-single-branch。これがほとんどの場合に必要です。
Alireza Mohamadi

回答:


63

動作は正しく、最後のリビジョンの後、マスターブランチは(これがプライマリリモートのHEADであるため)リポジトリ内の唯一のリモートブランチになります。

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

完全なクローンは新しい(すべての)ブランチを提供します:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/debian
          remotes/origin/master
          remotes/origin/python_codegen

浅いクローン

技術文書の説明浅いため、「git-clone --depth 20 repo長さが最大20のコミットチェーンの結果[...]の結果」したがって、浅いクローンには、ブランチの先端から、要求されたコミットの深さが含まれている必要があります。

-ほかに-の文書化git cloneのために--single-branch-optionを説明します。

--branchオプションまたはプライマリブランチリモートのHEADポイントで指定された単一ブランチの先端に至る履歴のみを複製し--depthます。オプションを使用して浅いクローンを作成する場合、これはデフォルトです。ただし--no-single-branch、すべてのブランチのヒント。

したがって、浅いのクローン深さ -optionは)だけ取り出すだけ1つのブランチを(あなたの要求された深さで)。


残念ながら、過去に両方のオプション(--depth--single-branch)に問題があり、浅いクローンを使用すると未解決の問題が暗黙的に発生します(上記のリンクで確認できます)。これは、指定された履歴の書き換えによって引き起こされます。これにより、特殊なケースでは全体的にやや複雑な動作になります。


1
florianb:あなたのgitバージョンは何ですか?試していただきありがとうございます。1.7.1で--depth 1を実行したところ、すべてのリモートブランチが表示されました。これで質問を更新しました。問題を検証するための+1。
明華2014年

1
@minghua:1.8.4を使用しています-その問題にパッチがあった場合、少し調査します。
Florian Breisch、2014年

1
@minghua:「浅いクローン」に関する新しい発見を反映するように編集しました。
Florian Breisch、2014年

1
1つだけを除いて、ほぼ完璧です。「リポジトリの所有者が他のブランチを切り離すことにした」とはどういう意味ですか?それらの支店はまだ残っていると思います。
明華2014年

2
--no-single-branchもすべてのタグを複製します。新しいリポジトリを作成し、同じ設定を使用してすべてのリモートをフェッチして、つまり(なしで)fetch = +refs/heads/*:refs/remotes/origin/*実行することで、これを回避できます。のような設定を使用して、フェッチする特定のタグを追加することもできます。git fetch --depth 1--tagsfetch = +refs/tags/v2.0.0:refs/tags/v2.0.0
Sam Watkins

204

浅いクローンを作成した後、リモートから他のブランチチェックアウトできるようにするには、

  1. 実行(@jthillに感謝):

    git remote set-branches origin '*'
    
  2. その後、 git fetch -v

  3. 最後に git checkout the-branch-i-ve-been-looking-for


手順1は、編集して手動で行うこともできます。 .git/configます。

たとえば、次の行を次のように変更します。

fetch = +refs/heads/master:refs/remotes/origin/master

(置き換えmaster*):

fetch = +refs/heads/*:refs/remotes/origin/*

57
git remote set-branches origin '*'すべてのブランチに使用することもできます*。1つをブランチ名に置き換えます。
jthill

ありがとうございました!これは私の日を救った。
Steven Xu

-vvvどういう意味git fetch -vvvですか?私はそれについての情報をgit-fetch docで見つけられません
guo

@guo verbosityまたはのdebugログレベルですgitfetchメソッドからではありません。
marlo

1
@ kawing-chiuこれは、ブランチが非常に多く、サイズが以前の「インターネット接続」に対して大きすぎて、今ではそれらすべてのブランチを取得できる場合に便利です。:)
marlo 2017

61

@jthillからの応答とコメントを読むことから、私にとって最もうまくいっset-branchesたのは、git remoteコマンドでオプションを使用することでした:

$ git clone --depth 1 https://github.com/dogescript/dogescript.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

これにより、指定されたリモートによって追跡されるブランチのリストが変更され、必要なブランチだけをフェッチしてチェックアウトできるようになります。


15
git remote set-branches --add origin 'remote_branch_name'.git / configファイルでフェッチするためにリモートのブランチ(またはブランチパターン)のリストでそれらを置き換えるよりも、新しいブランチが既存のブランチに追加されるように使用する方が良い場合があります。
dumbledad 2017

2
OMG、シングルクォート'は重要ですgit remote set-branches --add origin 'remote_branch_name'
週末の

@週末単一引用符を
省略

@PandaWoodおそらくWindowsを使用しています。回答の「$」記号はBashを意味します(UnixまたはCygwin / MSYS)。
Yongwei Wu

私はドキュメントで必要な単一引用符について何も見ていませんそしてそれは少なくともmacOSでそれなしでうまくいくようです。
Nickolay
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.