Próbuję tutaj zrobić wymyślne rzeczy z hookami Gita, ale tak naprawdę nie wiem, jak to zrobić (lub jeśli to możliwe).
To, co muszę zrobić, to: w każdym zatwierdzeniu chcę wziąć jego hash, a następnie zaktualizować plik w zatwierdzeniu tym hashem.
Jakieś pomysły?
Odpowiedzi:
Poleciłbym zrobić coś podobnego do tego, co masz na myśli: umieszczenie SHA1 w nieśledzonym pliku, generowanym w ramach procesu budowania / instalacji / wdrażania. Jest to oczywiście łatwe do zrobienia (
git rev-parse HEAD > filename
a możegit describe [--tags] > filename
) i pozwala uniknąć zrobienia czegoś szalonego, na przykład skończenia z plikiem, który różni się od tego, co śledzi git.Twój kod może następnie odwoływać się do tego pliku, gdy potrzebuje numeru wersji, lub proces kompilacji może uwzględnić te informacje w produkcie końcowym. To ostatnie jest w rzeczywistości sposobem, w jaki sam git otrzymuje numery wersji - proces budowania pobiera numer wersji z repozytorium, a następnie wbudowuje go w plik wykonywalny.
źródło
Nie można zapisać aktualnego skrótu zatwierdzenia: jeśli uda Ci się wstępnie obliczyć wartość skrótu przyszłego zatwierdzenia - zmieni się on, gdy tylko zmodyfikujesz dowolny plik.
Istnieją jednak trzy opcje:
pre-commit
, zapisz poprzedni hash zatwierdzenia :) Nie modyfikujesz / nie wstawiasz zatwierdzeń w 99,99% przypadków, więc to BĘDZIE działało. W najgorszym przypadku nadal możesz zidentyfikować wersję źródłową.Pracuję nad skryptem przechwytującym, wrzucę go tutaj 'po zakończeniu', ale nadal - przed wydaniem Duke Nukem Forever :))
Aktualizacja : kod dla
.git/hooks/pre-commit
:Teraz jedyne, czego potrzebujemy, to narzędzie, które konwertuje
prev_commit,branch
parę na prawdziwy hash zatwierdzenia :)Nie wiem, czy to podejście może odróżnić scalanie zatwierdzeń od siebie. Niedługo to sprawdzę
źródło
Ktoś wskazał mi sekcję „man gitattributes” na ident, która zawiera:
ident
Jeśli się nad tym zastanowić, to właśnie robią CVS, Subversion itp. Jeśli spojrzysz na repozytorium, zobaczysz, że plik w repozytorium zawsze zawiera na przykład $ Id $. Nigdy nie zawiera rozszerzenia tego. Dopiero przy kasie tekst jest rozszerzany.
źródło
ident
jest skrótem dla samego pliku, a nie przyspieszeniem zatwierdzenia. Z git-scm.com/book/en/… : "Jednak ten wynik ma ograniczone zastosowanie. Jeśli używałeś podstawiania słów kluczowych w CVS lub Subversion, możesz dołączyć datownik - SHA nie jest aż tak pomocny, ponieważ jest to dość przypadkowe i nie można stwierdzić, czy jeden SHA jest starszy czy nowszy od innego ”.filter
wymaga pracy, ale może pobrać informacje o zmianach do (iz) pliku.Można to osiągnąć za pomocą
filter
atrybutu w gitattributes . Musiałbyś podaćsmudge
polecenie, które wstawia identyfikator zatwierdzenia, iclean
polecenie, które je usuwa, tak aby plik, w którym jest wstawiony, nie zmienił się tylko z powodu identyfikatora zatwierdzenia.W związku z tym identyfikator zatwierdzenia nigdy nie jest przechowywany w obiekcie blob pliku; jest po prostu rozszerzony w kopii roboczej. (Właściwie wstawienie identyfikatora zatwierdzenia do obiektu blob stałoby się zadaniem nieskończenie rekurencyjnym. ☺) Każdy, kto klonuje to drzewo, musiałby ustawić atrybuty dla siebie.
źródło
Pomyśl poza polem zmian!
wrzuć to do pliku hooks / post-checkout
Wersja będzie dostępna wszędzie tam, gdzie jej użyjesz.
źródło
Nie sądzę, abyś chciał to zrobić, ponieważ kiedy plik w zatwierdzeniu jest zmieniany, zmienia się również skrót zatwierdzenia.
źródło
Pozwólcie, że zbadam, dlaczego jest to trudny problem z wykorzystaniem wewnętrznych elementów git. Możesz pobrać sha1 bieżącego zatwierdzenia przez
Zasadniczo uruchamiasz sumę kontrolną sha1 dla wiadomości zwróconej przez
git cat-file commit HEAD
. Po przeanalizowaniu tej wiadomości od razu pojawiają się dwie rzeczy. Jeden to drzewo sha1, a drugi to czas zatwierdzenia.Teraz można łatwo zająć się czasem zatwierdzenia, zmieniając wiadomość i odgadując, ile czasu zajmie wykonanie zatwierdzenia lub zaplanowanie zatwierdzenia w określonym czasie. Prawdziwym problemem jest drzewo sha1, z którego można uzyskać
git ls-tree $(git write-tree) | git mktree
. Zasadniczo robisz sumę kontrolną sha1 dla wiadomości z ls-tree, która jest listą wszystkich plików i ich sumą kontrolną sha1.Dlatego suma kontrolna sha1 twojego zatwierdzenia zależy od sumy kontrolnej sha1 twojego drzewa, która bezpośrednio zależy od sumy kontrolnej pliku sha1, która zamyka okrąg i zależy od zatwierdzenia sha1. Tak więc masz problem z metodami dostępnymi dla mnie.
Przy mniej bezpiecznych sumach kontrolnych okazało się, że możliwe jest zapisanie sumy kontrolnej pliku do samego pliku przy użyciu brutalnej siły; jednak nie znam żadnej pracy, która wykonałaby to zadanie z sha1. Nie jest to niemożliwe, ale prawie niemożliwe przy naszym obecnym rozumieniu (ale kto wie, może za kilka lat będzie to trywialne). Jednak nadal jest to jeszcze trudniejsze do brutalnej siły, ponieważ musisz zapisać (zatwierdzoną) sumę kontrolną (drzewa) sumy kontrolnej (blob) do pliku.
źródło