Klon Gita bez katalogu .git

144

Czy jest flaga, do której należy przekazać gitpodczas klonowania, powiedzmy nie klonuj .gitkatalogu? Jeśli nie, co powiesz na flagę umożliwiającą usunięcie .gitkatalogu po sklonowaniu?

Justin
źródło
41
To pytanie nie jest naśladownictwem Jak zrobić „eksport git” (jak „eksport svn”) . To pytanie pyta, w jaki sposób sklonować do repozytorium (zdalne) bez z .gitkatalogu. Domniemany oszust pyta, jak wyeksportować istniejące repozytorium, w którym masz już .gitkatalog.
mknaf
3
Zgodzić się. Nie możesz git archivezdalnie repozytorium, jak mówi rozwiązanie „możliwy duplikat”.
Vladislav Rastrusny

Odpowiedzi:

214

Posługiwać się

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • Opcja głębi zapewni skopiowanie najmniejszej możliwej ilości historii, aby uzyskać to repozytorium.
  • Opcja gałęzi jest opcjonalna i jeśli nie zostanie określona, ​​otrzyma master.
  • Druga linia utworzy twój katalog dirformynewrepo nie będzie już repozytorium Git.
  • Jeśli wykonujesz rekurencyjne klonowanie podmodułów, parametr głębokość i rozgałęzienie nie ma zastosowania do modułów podrzędnych.
Adam Dymitruk
źródło
19
co to !$/.gitznaczy
Jürgen Paul,
15
Dla zainteresowanych jest to jeden z oznaczników słów , część funkcji rozszerzenia historii w Bash i zsh.
Rufflewind
Czy istnieje sposób, aby uzyskać głębokość = 1 wszystkich gałęzi w repozytorium? nie tylko mistrz lub określona gałąź
Gayan Pathirage
2
robisz to za pomocą opcji --no-single-branch, ponieważ --depth implikuje --single-branch, możesz cofnąć implikację za pomocą --no-single-branch. (Zaczerpnięte ze strony podręcznika git clone)
Robert Stoddard,
8
Używanie !$, choć technicznie poprawne w tym przypadku, nie pomaga ludziom, którzy nie rozpoznają składni, zrozumieć odpowiedzi na rzeczywiste pytanie. Opiera się również na drugim poleceniu bezpośrednio następującym po pierwszym i w tej samej powłoce. Jeśli ktoś pominie te niejawne wymagania, może w końcu usunąć coś zupełnie innego. Dlatego sugeruję, że twoją odpowiedź można poprawić, wyraźnie określając nazwę dirformynewrepojako argument rmpolecenia, ponieważ sprawi, że połączenie między oboma poleceniami będzie znacznie wyraźniejsze.
davidA
29

ponieważ potrzebujesz tylko plików, nie musisz traktować ich jako repozytorium git.

rsync -rlp --exclude '.git' user@host:path/to/git/repo/ .

i działa to tylko z lokalną ścieżką i zdalną ścieżką ssh / rsync, może nie działać, jeśli zdalny serwer zapewnia tylko dostęp git: // lub https: //.

Huang Tao
źródło
że nie weźmie pod uwagę .gitignore?
JJ Roman
itub ma rację, to tylko kopiowanie drzewa roboczego. git checkout robił to poprawnie, teraz już nie.
Sylvain
więc co zrobisz, jeśli serwer zapewnia tylko dostęp git: //?
Rainb
3

Alternatywnie, jeśli masz zainstalowany Node.js , możesz użyć następującego polecenia:

npx degit GIT_REPO

npxjest dostarczany z Node i umożliwia uruchamianie pakietów opartych na węzłach binarnych bez ich wcześniejszej instalacji (alternatywnie możesz najpierw zainstalować degitglobalnie za pomocą npm i -g degit).

Degit to narzędzie stworzone przez Richa Harrisa, twórcę Svelte and Rollup, którego używa do szybkiego tworzenia nowego projektu poprzez klonowanie repozytorium bez zachowywania folderu git. Ale można go również użyć do sklonowania dowolnego repozytorium raz ...

Erik Vullings
źródło
-1

Zawsze możesz to zrobić

git clone git://repo.org/fossproject.git && rm -rf fossproject/.git

źródło
44
pobrać wszystko i później usunąć katalog? na przykład emacs ma 95% 1 GB w pliku .git. więc --depth = 1 jest tutaj oczywiście rozwiązaniem.
RParadox
1
nadal widzę folder .git, kiedy robię depth = 1
Aryeh Armon
@AryehArmon oczywiście, że to widzisz. Używanie --depth nie zapobiega tworzeniu .git, po prostu sprawia, że ​​jest on płytką kopią, a więc znacznie mniejszym dla .git. Ale jeśli w ogóle go tam nie chcesz, musisz go później usunąć.
zeycus