git shallow clone (clone --depth) pomija zdalne gałęzie


103

Po sklonowaniu zdalnego repozytorium nie pokazuje żadnej zdalnej gałęzi za pomocą opcji -a. Jaki może być problem? Jak to debugować? W tym fragmencie dwa zdalne gałęzie nie są pokazane:

$ 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

Wypróbowałem to samo polecenie na innym komputerze, działa dobrze:

$ 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

Próbowałem również sklonować inne repozytorium, działa dobrze. Chociaż mogę spróbować ponownie na tej maszynie, ale lepiej byłoby wiedzieć, co jest nie tak.

Wszelkie sugestie i wskazówki będą mile widziane.

Edycja: Podsumowanie odpowiedzi: Od wersji 1.8.3.2 gita "--depth" i "--no-single-branch" muszą być używane razem, aby uzyskać takie samo zachowanie jak poprzednio. Jest to uważane za naprawę błędu.


3
masterto twój lokalny oddział. remotes/origin/masterto odpowiednia gałąź zdalna. O co właściwie chodzi?
michas

1
Czy może zapomniałeś o gadatliwości? Spróbujgit branch -avv
jthill

Do michasa itp .: zazwyczaj nie odnosimy się do mastera jako oddziału, przepraszam za zamieszanie. dodano „dwa zdalne gałęzie nie są wyświetlane”. Do jthill: dzięki za przypomnienie, masz rację.
minghua

1
Dziękuję za wprowadzenie git clone --depth=1 --no-single-branch, właśnie tego potrzebuję w większości przypadków.
Alireza Mohamadi

Odpowiedzi:


62

Zachowanie jest poprawne, po ostatniej wersji master-branch jest (ponieważ jest to HEAD głównego pilota) jedyną zdalną gałąź w repozytorium:

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

Pełny klon oferuje nowe (wszystkie) gałęzie:

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

Płytkie klony

Ze względu na krótki opis w dokumentacji technicznej „ git-clone --depth 20 repo[...] skutkuje łańcuchami zatwierdzeń o długości co najwyżej 20”. Dlatego płytki klon powinien zawierać żądaną głębokość zatwierdzeń z czubka gałęzi.

Ponieważ - dodatkowo - dokumentacja git clonedla --single-branchopcji opisuje:

„Klonuj tylko historię prowadzącą do końca pojedynczej gałęzi, określoną przez --branchopcję lub HEADpunkty zdalnego oddziału głównego w. Podczas tworzenia płytkiego klonu z tą --depthopcją jest to ustawienie domyślne, chyba że --no-single-branchpodano historie w pobliżu końcówki wszystkich gałęzi. "

Dlatego płytkie klon ( z tej głębokości -Opcja) jedynie pobiera tylko jeden pojedynczy oddział (w swojej żądanej głębokości).


Niestety obie opcje ( --depthi --single-branch) były w przeszłości błędne, a użycie płytkich klonów implikuje nierozwiązane problemy (jak możesz przeczytać w linku, który zamieściłem powyżej), co jest spowodowane podanym przepisaniem historii. Ogólnie prowadzi to do nieco skomplikowanego zachowania w szczególnych przypadkach.


1
florianb: jaka jest twoja wersja git? dzięki za wypróbowanie tego. Zrobiłem --depth 1 w wersji 1.7.1, teraz pokazuje wszystkie zdalne gałęzie. zaktualizował pytanie o to. +1 za zweryfikowanie problemu.
minghua

1
@minghua: Używam 1.8.4 - przeprowadzę małe dochodzenie, jeśli pojawiła się poprawka w tym problemie.
Florian Neumann

1
@minghua: Edytowałem, aby odzwierciedlić nowe odkrycia dotyczące „płytkich klonów”.
Florian Neumann

1
Jest prawie doskonały, z wyjątkiem jednej rzeczy: co to znaczy, mówiąc „właściciel repozytorium zdecydował się odciąć pozostałe gałęzie”? Myślę, że te gałęzie wciąż tam są.
minghua

2
--no-single-branch także klonuje wszystkie tagi. Możemy tego uniknąć, tworząc nowe repozytorium, używając tej samej konfiguracji do pobierania wszystkich pilotów, tj. fetch = +refs/heads/*:refs/remotes/origin/*I uruchamiając git fetch --depth 1(bez --tags). Możemy również dodać określone tagi do pobrania, używając konfiguracji, takich jak fetch = +refs/tags/v2.0.0:refs/tags/v2.0.0.
Sam Watkins

217

Po wykonaniu płytkiego klona, ​​aby móc pobrać inne gałęzie ze zdalnego ,

  1. Uruchom (dzięki @jthill):

    git remote set-branches origin '*'
    
  2. Następnie zrób git fetch -v

  3. Wreszcie git checkout the-branch-i-ve-been-looking-for


Krok 1 można również wykonać ręcznie, edytując .git/config.

Na przykład zmień następujący wiersz z:

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

do (zamiast masterz *):

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

59
Możesz również użyć git remote set-branches origin '*'dla wszystkich gałęzi, zamień nazwę *gałęzi na jedną.
jthill

Dziękuję Ci! To uratowało mi dzień.
Steven Xu

Co to -vvvznaczy w git fetch -vvv? Nie znalazłem żadnych informacji na ten temat w dokumencie git-fetch
guo,

@guo jest dla poziomu logowania verbositylub . To nie jest metoda. debuggitfetch
marlo,

1
@ kawing-chiu jest to przydatne, jeśli masz tak wiele oddziałów, a ich rozmiar jest zbyt duży dla „połączenia internetowego” wcześniej, a teraz możesz sobie pozwolić na uzyskanie tych wszystkich oddziałów. :)
marlo

65

Od przeczytania odpowiedzi i komentarza z @jthill, najlepiej działało dla mnie użycie set-branchesopcji w git remotepoleceniu:

$ 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

Zmienia to listę gałęzi śledzonych przez nazwanego pilota, dzięki czemu możemy pobrać i wyrejestrować tylko wymaganą gałąź.


17
Lepiej byłoby użyć git remote set-branches --add origin 'remote_branch_name'tak, aby nowa gałąź była dodatkiem do istniejących, zamiast zastępować ją na liście gałęzi (lub wzorców gałęzi) pilota do pobrania w pliku .git / config.
dumbledad,

2
OMG, pojedynczy cytat 'jest ważny wgit remote set-branches --add origin 'remote_branch_name'
Weekend

@Weekend Nie mogłem tego uruchomić, dopóki nie zostawiłem pojedynczych cytatów
PandaWood

@PandaWood Prawdopodobnie korzystasz z systemu Windows. Znak „$” w odpowiedzi oznacza Bash (w systemie Unix lub Cygwin / MSYS).
Yongwei Wu

Nie widzę niczego, aby pojedyncze cudzysłowy były konieczne w dokumentach i wydaje się działać dobrze bez jednego przynajmniej na macOS.
Nickolay
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.