Chciałbym zachować (na razie) możliwość łączenia zestawów zmian Git z elementami roboczymi przechowywanymi w TFS.
Napisałem już narzędzie (używając haka z Git), w którym mogę wstrzykiwać identyfikatory robocze do wiadomości zestawu zmian Git.
Chciałbym jednak również zapisać identyfikator Git commit (skrót) w niestandardowym polu roboczym TFS. W ten sposób mogę zbadać element roboczy w TFS i zobaczyć, jakie zestawy zmian Git są powiązane z elementem roboczym.
Jak mogę łatwo pobrać skrót z bieżącego zatwierdzenia z Git?
git
tfs
tfs-workitem
changeset
Sardaukar
źródło
źródło
--verify
oznacza, że:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.
git rev-parse --short HEAD
zwraca krótką wersję skrótu, na wypadek, gdyby ktoś się zastanawiał.--short
, na przykład--short=12
, aby uzyskać określoną liczbę cyfr z skrótu.--short=N
jest o minimalnej liczbie cyfr; git używa większej liczby cyfr, jeśli skrócona jedna byłaby nie do odróżnienia od skróconej drugiej zmiany. Spróbuj np .git rev-parse --short=2 HEAD
Lubgit log --oneline --abbrev=2
.git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
Jeśli chcesz tylko skrócony skrót:
Ponadto użycie% H jest innym sposobem na uzyskanie długiego skrótu.
źródło
git log
to porcelana igit rev-parse
hydraulika.git checkout 33aa44; git log -n 1
daje mi33aa44
. Jakiej wersji git używasz?Kolejny, używając git log:
Jest bardzo podobny do @outofculture, choć nieco krótszy.
źródło
HEAD
.HEAD
wskazuje to zatwierdzenie, a nie nazwany branche znany jako odłączona głowa .Aby uzyskać pełną SHA:
Aby uzyskać skróconą wersję:
źródło
git
commit
potrzebne są dwa skróty, na przykład jeden zbranch
aktualniemaster
branch
używanego i a , możesz także użyć,git rev-parse FETCH_HEAD
jeśli potrzebujesz skrótu dla tegomaster
commit
, comerge
d w bieżącymbranch
. np. jeśli maszbranch
esmaster
ifeature/new-feature
dla danego repo., podczas gdyfeature/new-feature
można go użyć,git fetch origin master && git merge FETCH_HEAD
a następnie,git rev-parse --short FETCH_HEAD
jeśli potrzebujeszcommit
skrótu z pomaster
prostumerge
d dla wszystkich skryptów, które możesz mieć.Dla kompletności, ponieważ nikt jeszcze tego nie zasugerował.
.git/refs/heads/master
to plik zawierający tylko jedną linię: skrót najnowszego zatwierdzeniamaster
. Więc możesz po prostu przeczytać to stamtąd.Lub jako polecenie:
Aktualizacja:
Zauważ, że git obsługuje teraz przechowywanie niektórych odniesień do głowy w pliku pack-ref zamiast jako pliku w folderze / refs / heads /. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
źródło
master
, co niekoniecznie jest prawdą.master
..git/HEAD
zazwyczaj wskazuje na ref, jeśli masz tam SHA1, jesteś w trybie odłączonej głowy..git
podkatalogu, co niekoniecznie ma miejsce. Zobacz--separate-git-dir
flagę nagit init
stronie man.Zatwierdź skrót
Skrót skrótu zatwierdzenia
Kliknij tutaj, aby uzyskać więcej
git show
przykładów.źródło
Zawsze
git describe
też jest. Domyślnie daje ci -źródło
git describe --long --dirty --abbrev=10 --tags
że da mi coś takiego,7.2.0.Final-447-g65bf4ef2d4
co wynosi 447 zatwierdzeń po tagu 7.2.0.Final i pierwsze 10 skrótów globalnego SHA-1 w bieżącym HEAD to „65bf4ef2d4”. Jest to bardzo dobre dla ciągów wersji. Z opcją --long zawsze doda liczbę (-0-) i skrót, nawet jeśli tag pasuje dokładnie.git describe --always
„pokaże unikalny skrót obiektu zatwierdzenia jako rezerwowego”git describe --tags --first-parent --abbrev=11 --long --dirty --always
. Ta--always
opcja oznacza, że zapewnia wynik (skrót), nawet jeśli nie ma żadnych tagów. Te--first-parent
środki nie zobowiązuje się mylić scalania i wyłącznie następujące elementy na bieżącej gałęzi. Zauważ też, że--dirty
zostanie dołączony-dirty
do wyniku, jeśli bieżąca gałąź ma niezatwierdzone zmiany.Posługiwać się
git rev-list --max-count=1 HEAD
źródło
Jeśli chcesz przechowywać skrót w zmiennej podczas skryptu, możesz użyć
Lub jeśli chcesz tylko pierwszych 10 znaków (jak robi to github.com)
źródło
--short
lub ; nie ma potrzeby używania rury i .--short=number
git rev-parse
cut
Jeśli chcesz zrobić super-hacky sposób:
Zasadniczo git przechowuje lokalizację HEAD w .git / HEAD, w formie
ref: {path from .git}
. To polecenie czyta to, oddziela „ref:” i odczytuje wskazany plik.To oczywiście zawiedzie w trybie odłączonej głowy, ponieważ HEAD nie będzie „ref: ...”, ale sam hash - ale wiesz, nie sądzę, że spodziewasz się tyle mądrości w twoim bashu -linery. Jeśli nie uważasz, że średniki oszukują ...
źródło
sh
. Pół godziny komentarzy do dokumentacji później, a oto streszczenieNajbardziej zwięzły sposób, jaki znam:
Jeśli chcesz określoną liczbę cyfr skrótu, możesz dodać:
źródło
git show
jest to tak zwane polecenie porcelanowe (tj. Skierowane do użytkownika), dlatego nie powinno się go używać w skryptach, ponieważ jego wyniki mogą ulec zmianie.git rev-parse --short HEAD
Zamiast tego należy użyć powyższej odpowiedzi ( ).git help show
dlaporcelain
.--porcelain
, dlatego jest to mylące. Możesz znaleźć szczegóły w tej wspaniałej odpowiedzi VonCByć może potrzebujesz aliasu, abyś nie musiał pamiętać wszystkich fajnych szczegółów. Po wykonaniu jednego z poniższych kroków będziesz mógł po prostu wpisać:
W odpowiedzi na przyjętą odpowiedź , oto dwa sposoby skonfigurowania tego:
1) Naucz git jawnie, edytując globalną konfigurację (moja oryginalna odpowiedź):
2) Lub jeśli lubisz skrót, aby nauczyć go, jak ostatnio skomentował Adrien:
Odtąd użyj,
git lastcommit
aby pokazać skrót ostatniego zatwierdzenia.źródło
git config --global alias.lastcommit "rev-parse HEAD"
Potrzebowałem czegoś nieco innego: wyświetl pełny sha1 zatwierdzenia, ale dodaj gwiazdkę na końcu, jeśli katalog roboczy nie jest czysty. O ile nie chcę używać wielu poleceń, żadna z opcji z poprzednich odpowiedzi nie działa.
Oto jedna wkładka, która:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Wynik:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*
Objaśnienie: opisuje (przy użyciu tagów z adnotacjami) bieżące zatwierdzenie, ale tylko z tagami zawierającymi „NOT A TAG”. Ponieważ znaczniki nie mogą mieć spacji, to nigdy nie pasuje do znacznika, a ponieważ chcemy pokazać wynik
--always
, polecenie cofa się, wyświetlając pełny (--abbrev=0
) sha1 zatwierdzenia i dodaje gwiazdkę, jeśli katalog roboczy to--dirty
.Jeśli nie chcesz dodawać gwiazdki, działa to tak, jak wszystkie inne polecenia z poprzednich odpowiedzi:
git describe --always --abbrev=0 --match "NOT A TAG"
Wynik:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
źródło
--match "NOT A TAG"
. Testowane w git 2.18.0 oraz 2.7.4. Czy jest jakaś sytuacja, w której ten argument jest potrzebny?Jeśli zależy ci na prędkości, podejście wspomniane przez Deestana
jest znacznie szybszy niż jakakolwiek inna metoda tu wymieniona.
źródło
show-ref
Wydaje mi się, że najlepszym rozwiązaniem dla skryptów, ponieważ jest to komenda instalacji wodociągowej, a tym samym gwarantuje (lub przynajmniej bardzo prawdopodobne), aby pozostać stabilne w przyszłych wydaniach: inne odpowiedzi użyćrev-parse
,show
,describe
lublog
, które są wszystkie polecenia porcelany. A w przypadkach, w których szybkość nie jest istotna, obowiązuje uwaga ze stronyshow-ref
podręcznika: „Zachęcamy do korzystania z tego narzędzia na rzecz bezpośredniego dostępu do plików w katalogu .git”.Oto jednowierszowy w powłoce Bash przy użyciu bezpośredniego odczytu z plików git:
Musisz uruchomić powyższą komendę w folderze głównym git.
Ta metoda może być przydatna, gdy masz pliki repozytorium, ale
git
polecenie nie zostało zainstalowane.Jeśli nie zadziała, sprawdź w
.git/refs/heads
folderze, jakie masz głowice.źródło
w swoim katalogu domowym w pliku „.gitconfig” dodaj:
będziesz miał łatwiejsze do zapamiętania polecenie:
źródło
Na git bash po prostu uruchom $ git log -1
zobaczysz te wiersze po twoim poleceniu.
źródło
Oto kolejna implementacja bezpośredniego dostępu:
Działa to również na http, co jest przydatne w lokalnych archiwach pakietów (wiem: w przypadku publicznych stron internetowych nie jest zalecane, aby katalog .git był dostępny):
źródło
Oto inny sposób na zrobienie tego z :)
źródło
Przykładowe dane wyjściowe:
ref: refs/heads/master
Parsuj to:
cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"
Jeśli masz system Windows, możesz rozważyć użycie wsl.exe:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"
Wynik:
refs/heads/master
Tej wartości można użyć do późniejszego pobrania kasy, ale wskazuje ona na jej SHA. Aby wskazywał na aktualną gałąź według nazwy, wykonaj następujące czynności:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"
Wyjścia:
master
źródło