web-dev-qa-db-ja.com

git shallow clone(clone --depth)はリモートブランチをミスします

リモートリポジトリを複製した後、-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」を一緒に使用して、以前と同じ動作をする必要があります。これはバグ修正と見なされます。

68
minghua

動作は正しいです。最後のリビジョンの後、マスターブランチは(これがプライマリリモートの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

浅いクローン

技術文書の shallow-description により、「git-clone --depth 20 repo [...] result [s]] chain with length of 20」したがって、浅いクローンには、ブランチの先端から、要求されたコミットの深さを含める必要があります。

として-さらに-git clone-オプションの --single-branch の説明は次のとおりです。

--branchオプションまたはプライマリブランチのリモートのHEADが指す単一ブランチの先端につながる履歴のみをクローンします。--depthオプション付きの浅いクローン、これはデフォルトです。ただし、--no-single-branchがすべてのブランチの先端付近の履歴を取得するために指定されている場合を除きます。 "

したがって、浅いclonewiththedepth-option)onlyfetchesonly1つの単一ブランチ(要求された深さで)。


残念ながら、両方のオプション(--depth--single-branch)は過去に欠陥があり、浅いクローンの使用は未解決の問題を暗示しています(上記のリンクで読むことができます)。履歴書き換え。これにより、特殊なケースでは全体的にやや複雑な動作になります。

52
Florian Breisch

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

  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/*
133
marlo

@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

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

47
alejandrodnm