Jestem bardzo zdezorientowany, jak używać git archive
.
Mam repozytorium git z folderami Foo , Bar i Baz na najwyższym poziomie. Muszę wyeksportować folder Foo w sposób podobny do SVN, aby szybko przeprowadzić test.
Dowiedziałem się, że mogę użyć git-archive
w eksportowej formie SVN .
Ale oto rzecz, następujące działa dobrze:
git archive master | tar -x -C ~/destination
powoduje to foldery Foo , Bar , Baz w folderze docelowym .
Jednak następujące błędy wystąpią z fatal not a valid object name
:
git archive master/foo | tar -x -C ~/destination
Dokumentacja
Patrząc na streszczenie git archive
programu widzę, że może on przyjąć <tree-ish> [path]
jako parametr (streszczenie podsumowane w odpowiednich częściach):
git archive <tree-ish> [path...]
Jeśli master/foo
nie tree-ish
, to co jest?
git
git-archive
dkinzer
źródło
źródło
master:foo
jest drzewiaste, ale lepiej użyjmaster foo
jako i<tree-ish> <path>
.git archive
poleceń nie odnoszą się już do drzewa, ale kiedy zadałem to pytanie, zrobili to. A jeśli chodzi o zaakceptowaną odpowiedź; w tamtym czasie nikt inny nie zadał sobie trudu, aby odpowiedzieć na pytanie. Ponad dwa lata później opublikowano nawet inną odpowiedź.Odpowiedzi:
Krótka odpowiedź (TL; DR)
„Drzewo” to termin odnoszący się do dowolnego identyfikatora (określonego w dokumentacji wersji Git ), który ostatecznie prowadzi do (pod) drzewa katalogów (Git określa katalogi jako „drzewa” i „obiekty drzew”).
W przypadku oryginalnego plakatu
foo
jest to katalog , który chce określić. Prawidłowym sposobem określenia (pod) katalogu w Git jest użycie składni "drzewa" (punkt # 15 z dokumentacji wersji Git ):Innymi słowy,
master:foo
to poprawna składnia, a niemaster/foo
.Inne „Tree-ish” (Plus Commit-ish)
Oto pełna lista identyfikatorów zatwierdzeń i drzew (z dokumentacji wersji Git , dzięki LopSae za wskazanie ):
Identyfikatory # 1-14 są wszystkie „zatwierdzone”, ponieważ wszystkie prowadzą do zatwierdzeń, ale ponieważ zatwierdzenia wskazują również drzewa katalogów, wszystkie ostatecznie prowadzą do obiektów (pod) drzewa katalogów i dlatego mogą być również używane jako „drzewo -ish ”.
Numer 15 może być również używany jako drzewo, gdy odnosi się do (pod) katalogu, ale może być również używany do identyfikowania określonych plików. Kiedy odnosi się do plików, nie jestem pewien, czy nadal jest uważany za „drzewo-ish”, czy działa bardziej jak „blob-ish” (Git określa pliki jako „bloby”).
Długa odpowiedź
Na najniższych poziomach Git śledzi kod źródłowy przy użyciu czterech podstawowych obiektów:
Każdy z tych obiektów ma swój własny identyfikator hash sha1, ponieważ Linus Torvalds zaprojektował Gita jako system plików z adresowaniem treści , tj. Pliki mogą być pobierane na podstawie ich zawartości (identyfikatory sha1 są generowane z zawartości pliku). Książka Pro Git zawiera przykładowy diagram :
Wiele poleceń Git może akceptować specjalne identyfikatory dla zatwierdzeń i (pod) drzew katalogów:
„Commit-ish” to identyfikatory, które ostatecznie prowadzą do obiektu zatwierdzenia. Na przykład,
tag -> commit
„Drzewo” to identyfikatory, które ostatecznie prowadzą do obiektów drzewiastych (tj. Katalogów).
tag -> commit -> project-root-directory
Ponieważ obiekty zatwierdzone zawsze wskazują na obiekt drzewa katalogów (katalog główny projektu), każdy identyfikator, który jest „zatwierdzony”, jest z definicji również „drzewem”. Innymi słowy, każdy identyfikator prowadzący do obiektu zatwierdzenia może być również użyty do wskazania obiektu drzewa (pod) katalogu .
Ale ponieważ obiekty drzewa katalogów nigdy nie wskazują zatwierdzeń w systemie kontroli wersji Gita, nie każdy identyfikator wskazujący na (pod) drzewo katalogów może być również użyty do wskazania zatwierdzenia. Innymi słowy, zestaw identyfikatorów „zatwierdzonych” jest ścisłym podzbiorem zbioru identyfikatorów „drzewiastych”.
Jak wyjaśniono w dokumentacji ( dzięki Treborowi za pomoc w znalezieniu ):
Zestaw drzew-owski identyfikatorów, które nie mogą być stosowane jako popełnić-owski są
<rev>:<path>
, co prowadzi bezpośrednio do drzew katalogów, a nie do zatwierdzania obiektów. Na przykładHEAD:subdirectory
.Identyfikatory Sha1 obiektów drzewa katalogów .
źródło
<tree-ish>
akceptować zarówno iman gitrevisions
określa:trees ("directories of files")
.git-archive
mówi, że trwa a,<tree-ish>
ale nie zezwala na<sha1>
. Więc myślę, że zamiast tego powinien poprosić o<tree-ish-ish>
. stackoverflow.com/a/12073669/680464Drzewo to sposób na nazwanie konkretnego drzewa, który może być jednym z następujących:
origin/somebranch
Na początku, że każdy z powyższych może być dodawana
^
,~
. W odwołaniach można również używać@{}
notacji dla niektórych dodatkowych funkcji:HEAD^
lubHEAD^1
zostanie zamieniony na pierwszego rodzica HEAD.HEAD^2
zdecyduje się na drugiego rodzicaHEAD^3
zdecyduje się na trzeciego rodzica i tak dalej, co jest rzadsze i jest wynikiem połączenia ze strategią ośmiornicy .HEAD~
lubHEAD~1
zdecyduje się na pierwszego rodzica głowyHEAD~2
rozwiąże się do pierwszego rodzica pierwszego rodzica HEAD. To byłoby to samo coHEAD^^
HEAD@{0}
rozwiąże się do bieżącego HEADHEAD@{1}
rozwiąże się do poprzedniej głowy. Może to być używane tylko przez odwołania, ponieważ korzysta z dziennika odniesień. W przypadkuHEAD
każdego zatwierdzenia, merge, checkout zmieni wartość HEAD i tym samym doda ją do dziennika.git reflog HEAD
wyświetli dziennik odniesienia, w którym możesz zobaczyć wszystkie ruchy HEAD i prawidłowo, co@{1}
i tak dalej się rozwiąże.Większość z powyższych może być dodatkowo połączone tak długo, jak to ma sens w swoim repozytorium, na przykład:
HEAD@{2}~3
,somebranch^2~4
,c00e66e~4^2
,anotherbranch~^~^~^
.Tak więc każda z opisanych powyżej kombinacji i jej kombinacje są w dokumentacji rozumiane jako drzewo, które jest tylko sposobem na określenie, które drzewo (lub wersja) jest tym, które powinno być używane dla większości poleceń git.
Więcej informacji w sekcji Wybór wersji w książce Git .
źródło
master:path/to/directory
który jest drzewem, ale nie zatwierdzeniem. Cupcake's czyni to wyraźniejszym.Prawdopodobnie chcesz
Wyrażenie
master/foo
nie ma sensu:master
jest nazwą gałęzi ifoo
jest nazwą katalogu, jak przypuszczam.Edytuj : (Usunięto uszkodzony link. Zobacz komentarze.)
źródło
Definicje
<tree-ish>
i<commit-ish>
zobacz stronę podręcznika git (1) . Będziesz musiał wyszukać terminy. Ogólnie<tree-ish>
oznacza odniesienie do obiektu drzewa git, ale jeśli przekażesz typ obiektu, który odwołuje się do drzewa (na przykład zatwierdzenie lub gałąź), git automatycznie użyje drzewa, do którego się odwołuje.źródło
gitrevisions(7)
.Jestem nowicjuszem w kontroli źródła i Git. To jest to, co wiem. Drzewo to struktura plików w repozytorium. Jest podobny do katalogu w systemie plików. Zobacz - Które narzędzie git wygenerowało ten widok drzewa?
Drzewo znaczy jak drzewo. Odnosi się do części lub zatwierdzenia drzewa. Możesz odwołać się do zatwierdzenia, używając jednego z nich: pełnego lub części skrótu SHA-1 zatwierdzenia, wskaźnika HEAD, odniesienia do gałęzi, odniesienia do znacznika. Inna metoda wykorzystuje dowolną z wymienionych metod wraz z przodkami lub rodzicami zatwierdzenia. Przykład przodków:
źródło
W glosariuszu Git drzewo-ish brzmi: „Obiekt drzewa lub obiekt, który może być rekursywnie dereferencjonowany do obiektu drzewa”. commit, HEAD i tag to przykłady obiektów drzewiastych.
źródło