2012-06-22 19 views
8

Mam centralne repozytorium Git. Kiedy pchasz się do repo, chcę uruchomić hak po otrzymaniu. Co zrobi ten hak to stworzyć wiadomość w projekcie Basecamp (używając swojego API). Chcę informacji o właśnie wykonanej aktualizacji. Teraz myślę, że git log -2 --stat jest wystarczająco dobry, ale chciałby trochę więcej informacji (gałąź, która została zaktualizowana, plik stworzony, pliki usunięte). Czy ktoś może pomóc z poleceniem, które muszę zrobić, aby uzyskać wszystkie informacje? Wykonywanie wielu poleceń jest w porządku ze mną, prawdopodobnie nie ma jednego polecenia, które dostarczy mi wszystkich informacji.Uzyskaj ostatnie zatwierdzenie repozytorium Git.

Odpowiedz

3

Można znaleźć najnowsze popełnić badając i sortowania plików w .git/refs/heads: Za każdym razem nowy commit jest wykonany, odpowiedni refs/heads plik zostanie zmieniony, to znaczy, gdy podjęciem master, refs/heads/master jest aktualizowana.

Opracujmy rozwiązanie.

pierwsze zadanie: znaleźć wszystkie branże (czyli wszystkie pliki pod refs/heads i wydrukować kiedy były ostatnio zmieniony Mówisz o hakach, więc dajemy ścieżkę względem katalogu .git/hooks.

find ../refs/heads -type f -printf '%[email protected] %p\n' 

ten tworzy listę wszystkich branż wraz z datą ich zmian Patrz man page of find o wyjaśnienie parametrów

drugie zadanie:.. porządek otrzymany lista

find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
sort 

Trzecie zadanie: musimy najnowszy element w tym wykazie. Od sort sortuje od starego do nowego, nasz pożądany element znajduje się na dole listy. Dostać ten element z tail (tylko jeden przedmiot, więc przechodzą flagę -1):

find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
sort |\ 
tail -1 

Czwarte zadanie: upuść datę w otrzymanej linii. Z naszego oświadczenia printf wiemy, że data i ścieżka są oddzielone spacją. Podaj to jako ogranicznik do cut (-d " ") i powiedz, że potrzebujemy drugiego pola (tj. Ścieżki pliku, -f 2). Dla wygody będziemy przechowywać ścieżkę do pliku w zmiennej o nazwie $LATESTHEAD:

LATESTHEAD=$(\ 
    find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
    sort |\ 
    tail -1 |\ 
    cut -d ' ' -f 2) 

Zadanie piąte: Teraz wiemy, nazwę pliku, ale musimy ich treść. To jest najnowsza rewolucja, którą można przekazać git log. cat wykonuje zadanie. Przechowywać najnowszą wersję w $LATESTREV

LATESTHEAD=$(\ 
    find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
    sort |\ 
    tail -1 |\ 
    cut -d ' ' -f 2) 
LATESTREV=$(cat $LATESTHEAD) 

Teraz można użyć $LATESTREV zrobić jakieś brudne rzeczy, które chcesz.

Być może nie jest to najbardziej eleganckie rozwiązanie (prawdopodobnie ktoś pojawi się i powie o wiele łatwiej jedno-liniowy), ale działa dla mnie.

+0

To faktycznie działa również dobrze. Potrzebuję również nazwy oddziału, więc domyślam się, że muszę uruchomić ** trzecie zadanie ** najpierw w nazwie oddziału. Następnie uruchamiam ** Piąte Zadanie **, aby uzyskać wartość skrótu zatwierdzenia. Następnie uruchamiam 'git log --stat -1 ', aby uzyskać pełne informacje o zatwierdzeniu. To dziwne, że muszę dodać '-1'. Nie robię tego wszystkiego ... dziwnie. W każdym razie wygląda na to, że to działa! Dzięki eckes! – Jeebs24

+0

Przepraszamy za promowanie mojej odpowiedzi, ale nie widzę, dlaczego używasz znaleźć tutaj, jeśli wszystkie informacje są podane na stdin przez git podczas wywoływania post-receive (patrz [githooks (5)] (https: //www.kernel. org/pub/software/scm/git/docs/githooks.html # post-receive)). –

2

Dodawanie --summary do dziennika git będzie produkować nową i usunięty plik z listą (GIT odnosi się do nich jako "węzły"):

git log --stat --summary -1 

dostać gałąź, spróbuj uruchomić:

git branch --contains `git log --oneline -1 |cut -f1 -d\ ` |cut -b3- 

Uwaga: testuję to na moim macu. Unix cut ma 1 indeks, ale wierzę, że Debian cut jest zindeksowany. Jeśli tak, i jeśli jesteś na polu Debiana, zmień -f1 do -f0 a polecenie oddział powinien działać dobrze

1

jeśli nie ma konkretnego powodu, dlaczego używasz post-receive, wolałbym sugerować użyciu update, który dostaje stary ref, nowy ref i branch jako argumenty wiersza poleceń.

Więc można po prostu cały dziennik pomocą poleceń git log sugerowanych tutaj i podając oldref..newref jako argumentu (zastępując oldref i newref odpowiednio).

Aby uzyskać więcej informacji, patrz githooks(5) manpage on the update hook. W razie potrzeby możesz nawet przerwać aktualizację, jeśli zajdzie taka potrzeba.

W rzeczywistości otrzymujesz te same informacje w haku post-receive na stdin. Nie rozumiem, dlaczego trzeba wykonać wiele poleceń, aby wykonać to zadanie.

+0

Jak uzyskać informacje o 'oldref' i' newref'? Jestem całkiem nowy z Git i hookami. Mam moje repozytorium Git połączone z moim Basecamp i działa jak czar. Ale jeśli jest lepszy sposób i mogę uzyskać więcej informacji, jeszcze lepiej. Zamierzam przeczytać dalej tę stronę podręcznika githooks (5), ale jeśli da się to zrobić, byłbym bardzo wdzięczny. – Jeebs24

+0

OK, zamiast tego przełączam się na hak 'update'. Dzięki za sugestię Jonas. – Jeebs24

Powiązane problemy