Git ma dobrze znane lub przynajmniej w pewnym stopniu dobrze znane, puste drzewo, którego SHA1 to:
4b825dc642cb6eb9a060e54bf8d69288fbee4904
(możesz to zobaczyć w każdym repozytorium, nawet nowo utworzonym, z git cat-file -t
i git cat-file -p
).
Jeśli ciężko pracujesz i jesteś bardzo ostrożny, możesz użyć tego pustego drzewa do przechowywania katalogu, który nie zawiera plików (zobacz odpowiedź na temat Jak dodać pusty katalog do repozytorium git ), chociaż nie jest to naprawdę dobry pomysł.
Jest to bardziej przydatne jako jeden argument, do git diff-tree
którego służy jeden z przykładowych punktów zaczepienia.
Zastanawiam się,
- na ile jest to wiarygodne - tj. czy jakaś przyszła wersja gita nie będzie miała numeru obiektu git
4b825dc642cb6eb9a060e54bf8d69288fbee4904
? - Dlaczego nie ma symbolicznej nazwy dla pustego drzewa (czy istnieje?).
(Szybkim i brudnym sposobem na stworzenie nazwy symbolicznej jest umieszczenie SHA1 np .git/Nulltree
.. Niestety musisz to zrobić dla każdego repozytorium. Wydaje się, że lepiej jest po prostu umieścić magiczną liczbę w skryptach itp. Mam tylko ogólną niechęć do magicznych liczb.)
git hash-object -t tree /dev/null
metoda (z odpowiedzi VonC poniżej) ma tę zaletę, że nie zakoduje na stałe SHA-1, na przykład na wypadek, gdyby jakaś przyszła wersja git przełączyła się na SHA-2. (Nie zamierzam przewidywać, kiedy to się stanie. :-) Łatwiej byłoby zmienić Mercurial na SHA-2, ponieważ zostawili dla niego miejsce.)Odpowiedzi:
Ten wątek wspomina:
Lub, jak proponuje Ciro Santilli w komentarzach :
Lub, jak widać tutaj , od Colina Schimmelfinga :
Więc wydaje mi się, że bezpieczniej jest zdefiniować zmienną z wynikiem tego polecenia jako puste drzewo sha1 (zamiast polegać na „dobrze znanej wartości”).
Uwaga: Git 2.25.1 (luty 2020) proponuje w zatwierdzeniu 9c8a294 :
I dodaje:
Uwaga, zobaczysz, że SHA1 wyskakuje w niektórych repozytoriach GitHub, gdy autor chce, aby jego pierwsze zatwierdzenie było puste (zobacz post na blogu „ Jak zainicjować moje repozytoria Git ”):
Da tobie:
(Zobacz drzewo SHA1?)
Możesz nawet zmienić bazę swojej istniejącej historii na podstawie tego pustego zatwierdzenia (zobacz „ git: jak wstawić zatwierdzenie jako pierwsze, przesuwając wszystkie pozostałe? ”)
W obu przypadkach nie polegasz na dokładnej wartości SHA1 tego pustego drzewa.
Po prostu postępujesz zgodnie z najlepszą praktyką, inicjując repozytorium pierwszym pustym zatwierdzeniem .
Aby to zrobić:
Spowoduje to wygenerowanie zatwierdzenia z SHA1 specyficznym dla twojego repozytorium, nazwy użytkownika, adresu e-mail, daty utworzenia (co oznacza, że SHA1 samego zatwierdzenia będzie za każdym razem inny).
Ale drzewem, do którego odwołuje się to zatwierdzenie, będzie
4b825dc642cb6eb9a060e54bf8d69288fbee4904
puste drzewo SHA1.Aby pokazać tylko drzewo zatwierdzenia (wyświetl drzewo zatwierdzeń SHA1):
Jeśli to zatwierdzenie, odwołujące się do pustego drzewa, jest rzeczywiście pierwszym zatwierdzeniem, możesz pokazać to puste drzewo SHA1 za pomocą:
(i to działa nawet w systemie Windows, z poleceniami Gnu w systemie Windows )
Jak skomentowano poniżej , użycie
git diff <commit> HEAD
spowoduje wyświetlenie całego pliku w bieżącej gałęzi HEAD:Uwaga: ta pusta wartość drzewa jest formalnie zdefiniowana w
cache.h
.Od Git 2.16 (Q1 2018) jest używany w strukturze, która nie jest już powiązana z (tylko) SHA1, jak widać w commit eb0ccfd :
Więcej informacji można znaleźć w artykule „ Dlaczego Git nie używa nowocześniejszego algorytmu SHA? ”: Jest to SHA-2 od wersji Git 2.19 (III kw. 2018 r.)
W Git 2.25 (Q1 2020) testy przygotowują do przejścia na SHA-2 i obejmują puste drzewo.
Zobacz popełnić fa26d5e , popełnić cf02be8 , popełnić 38ee26b , popełnić 37ab8eb , popełnić 0370b35 , popełnić 0253e12 , popełnić 45e2ef2 , popełnić 79b0edc , popełnić 840624f , popełnić 32a6707 , popełnić 440bf91 , popełnić 0b408ca , popełnić 2eabd38 (28 paź 2019) i popełnić 1bcef51 , zobowiązać ecde49b (5 października 2019) autor: brian m. carlson (
bk2204
) .(Scalony przez Junio C Hamano -
gitster
- w zatwierdzeniu 28014c1, 10 listopada 2019)Więc
t/oid-info/hash-info
teraz obejmuje:SHA2 "
6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
" jest nowym4b825dc642cb6eb9a060e54bf8d69288fbee4904
pustym drzewem SHA1 " ".źródło
git diff-tree
w niektórych skryptach, które piszę. Nie ma gwarancji, że w repozytorium znajduje się początkowe puste zatwierdzenie. Zastanawiam się więc, czy te skrypty mogą kiedyś się zepsuć.-w
dogit hash-object
, utworzy obiekt w repozytorium, z którym jest uruchamiany, i to odtworzy puste drzewo w repozytorium, z którym walczysz, gdyby kiedykolwiek zniknęło w przyszłości./dev/null
:printf '' | git hash-object --stdin -t tree
:)Napisałem post na blogu z dwoma różnymi sposobami znajdowania skrótu: http://colinschimmelfing.com/blog/gits-empty-tree/
Jeśli z jakiegoś powodu miałoby się to zmienić, możesz skorzystać z dwóch poniższych sposobów, aby go znaleźć. Jednak czułbym się całkiem pewnie, używając skrótu w aliasach .bashrc itp. I nie sądzę, aby to się zmieniło w najbliższym czasie. Przynajmniej będzie to prawdopodobnie główne wydanie gita.
Te dwa sposoby to:
git hash-object -t tree --stdin < /dev/null
git write-tree
to nowe repozytorium - hash zostanie wyprowadzony przez git write-tree.źródło
–-stdin
daje mifatal: Cannot open '–-stdin': No such file or directory
git 2.7.2. Jednak uruchomienie go bez,--stdin
jak w odpowiedzi VonC, daje wartość skrótuOto odpowiedź, jak utworzyć zatwierdzenie pustego drzewa nawet w przypadku, gdy repozytorium nie jest jeszcze puste. https://stackoverflow.com/a/14623458/9361507
Wolę jednak, aby „pusty” był tagiem, ale nie gałęzią. Prosty sposób to:
Ponieważ tag może wskazywać bezpośrednio na drzewo, bez zatwierdzenia. Teraz, aby pobrać wszystkie pliki w drzewie roboczym:
Lub to samo ze statystyką:
Wszystkie pliki jako różnice:
Sprawdź spacje we wszystkich plikach:
źródło
git rev-parse
miałbym nowe flagi lub słowa kluczowe lub coś w tym kierunku, aby wytworzyć (a) pusty hash drzewa i (b) hash null-commit. Oba byłyby przydatne w skryptach i chroniłyby przed proponowanymi zmianami SHA-256.