Я хотел бы сохранить (на данный момент) возможность связывать наборы изменений Git с рабочими элементами, хранящимися в TFS.
Я уже написал инструмент (используя хук из Git), в котором я могу добавить рабочие идентификаторы в сообщение набора изменений Git.
Однако я также хотел бы сохранить идентификатор коммита Git (хеш) в настраиваемом поле рабочего элемента TFS. Таким образом, я могу проверить рабочий элемент в TFS и посмотреть, какие наборы изменений Git связаны с рабочим элементом.
Как я могу легко получить хеш из текущего коммита из Git?
источник
--verify
подразумевает, что:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.
git rev-parse --short HEAD
возвращает короткую версию хэша, на случай, если кому-то интересно.--short
, например--short=12
, чтобы получить определенное количество цифр из хеша.--short=N
о минимальном количестве цифр; git использует большее количество цифр, если укороченная будет неотличима от другой укороченной фиксации. Попробуйте напримерgit rev-parse --short=2 HEAD
илиgit log --oneline --abbrev=2
.git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
Если вы хотите только сокращенный хеш:
Кроме того, использование% H - это еще один способ получить длинный хэш.
источник
git log
это фарфор иgit rev-parse
сантехника.git checkout 33aa44; git log -n 1
дает мне33aa44
. Какую версию Git вы используете?Еще один, используя git log:
Это очень похоже на @outofculture, но немного короче.
источник
HEAD
.HEAD
указывает на этот коммит, а не на именованную ветку, известную как отдельная голова .Чтобы получить полный SHA:
Чтобы получить сокращенную версию:
источник
git
commit
хэша, например, один из тех, сbranch
которыми вы сейчас работаете, и amaster
branch
, вы также можете использовать его,git rev-parse FETCH_HEAD
если вам нужен хеш для того,master
commit
что выmerge
добавили в свой текущийbranch
. например, если у вас естьbranch
esmaster
иfeature/new-feature
для данного репо., в то время какfeature/new-feature
вы могли бы использовать,git fetch origin master && git merge FETCH_HEAD
а затем,git rev-parse --short FETCH_HEAD
если вам нуженcommit
хеш из только что использованныхmaster
вамиmerge
сценариев.Для полноты, так как никто еще не предложил это.
.git/refs/heads/master
это файл, который содержит только одну строку: хэш последней фиксацииmaster
. Так что вы можете просто прочитать это оттуда.Или как команда:
Обновить:
Обратите внимание, что git теперь поддерживает сохранение некоторых ссылок в файле pack-ref, а не в виде файла в папке / refs /head /. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
источник
master
, что не обязательно верно.master
..git/HEAD
обычно указывает на ссылку, если у вас есть SHA1 там, вы находитесь в режиме отсоединенной головы..git
подкаталога, что не всегда так. Смотрите--separate-git-dir
флаг наgit init
странице руководства .Зафиксируйте хеш
Сокращенный коммит хеш
Нажмите здесь для большего количества
git show
примеров.источник
Там всегда
git describe
так же. По умолчанию это дает вам -источник
git describe --long --dirty --abbrev=10 --tags
что это даст мне что-то вроде7.2.0.Final-447-g65bf4ef2d4
447 коммитов после тега 7.2.0.Final и первые 10 дайджестов глобального SHA-1 в текущем HEAD: «65bf4ef2d4». Это очень хорошо для версий строк. При использовании параметра --long всегда добавляются счетчик (-0-) и хэш, даже если тег точно совпадает.git describe --always
, «покажет однозначно сокращенный объект коммита как запасной вариант»git describe --tags --first-parent --abbrev=11 --long --dirty --always
. Параметр--always
означает, что он предоставляет результат (хэш), даже если нет тегов. Это--first-parent
означает, что он не запутывается коммитами слияния и следует только за элементами в текущей ветке. Обратите внимание, что--dirty
это добавит-dirty
к результату, если текущая ветвь имеет незафиксированные изменения.использование
git rev-list --max-count=1 HEAD
источник
Если вам нужно сохранить хеш в переменной во время скрипта, вы можете использовать
Или, если вы хотите только первые 10 символов (как делает github.com)
источник
--short
или--short=number
дляgit rev-parse
; Не нужно использовать трубу и дрcut
.Если вы хотите супер-хакерский способ сделать это:
По сути, git хранит местоположение HEAD в .git / HEAD в форме
ref: {path from .git}
. Эта команда считывает это, вырезает «ref:» и считывает любой файл, на который она указала.Это, конечно, потерпит неудачу в режиме отсоединенной головы, так как HEAD не будет «ref: ...», но сам хэш - но вы знаете, я не думаю, что вы ожидаете, что много умных в вашем bash один -liners. Если вы не думаете, что точки с запятой обманывают ...
источник
sh
. Спустя полчаса комментариев к документации, и вот сутьСамый краткий путь, который я знаю:
Если вам нужно конкретное количество цифр хеша, вы можете добавить:
источник
git show
это то, что известно как фарфоровая команда (то есть обращенная к пользователю), и поэтому не должно использоваться в сценариях, потому что ее выходные данные могут быть изменены. Ответ выше (git rev-parse --short HEAD
) следует использовать вместо этого.git help show
поporcelain
.--porcelain
, поэтому это сбивает с толку. Вы можете найти подробности в этом великолепном ответе VonCВозможно, вам нужен псевдоним, поэтому вам не нужно запоминать все изящные детали. Выполнив одно из следующих действий, вы сможете просто набрать:
Следуя принятому ответу , вот два способа установить это:
1) Научите git явным образом, отредактировав глобальный конфиг (мой оригинальный ответ):
2) Или, если вам нравится ярлык, чтобы научить Git ярлык, как недавно прокомментировал Адриен:
С этого
git lastcommit
момента используйте, чтобы показать хэш последнего коммита.источник
git config --global alias.lastcommit "rev-parse HEAD"
Мне нужно было что-то немного другое: отобразить полный sha1 коммита, но добавить звездочку в конец, если рабочий каталог не чистый. Если я не хотел использовать несколько команд, ни один из вариантов в предыдущих ответах не работает.
Вот один вкладыш, который делает:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Результат:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*
Объяснение: описывает (используя аннотированные теги) текущую фиксацию, но только с тегами, содержащими «NOT A TAG». Поскольку у тегов не может быть пробелов, это никогда не соответствует тегу, и поскольку мы хотим показать результат
--always
, команда возвращается к отображению полного (--abbrev=0
) sha1 коммита и добавляет звездочку, если рабочий каталог есть--dirty
.Если вы не хотите добавлять звездочку, это работает как все остальные команды в предыдущих ответах:
git describe --always --abbrev=0 --match "NOT A TAG"
Результат:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
источник
--match "NOT A TAG"
. Протестировано в git 2.18.0 и 2.7.4. Есть ли ситуация, когда нужен этот аргумент?Если вы идете на скорости, хотя, подход, упомянутый Дестаном
значительно быстрее, чем любой другой метод, перечисленный здесь до сих пор.
источник
show-ref
мне кажется, лучшим вариантом для написания сценариев, так как это команда водопроводной и , таким образом , гарантируется (или , по крайней мере , весьма вероятно) , чтобы оставаться стабильными в будущих версиях: другие ответы использоватьrev-parse
,show
,describe
илиlog
, что все команды фарфора. А в тех случаях, когда скорость не имеет значения, применяется примечание наshow-ref
странице руководства : «Использование этой утилиты рекомендуется для прямого доступа к файлам в каталоге .git».Вот одна строка в оболочке Bash, использующая прямое чтение из файлов git:
Вам нужно запустить вышеуказанную команду в вашей корневой папке git.
Этот метод может быть полезен, когда у вас есть файлы репозитория, но
git
команда не установлена.Если не получится, проверьте в
.git/refs/heads
папке, какие у вас головы.источник
в вашем домашнем каталоге в файле ".gitconfig" добавьте следующее
тогда вам будет легче запомнить команду:
источник
В git bash просто запустите $ git log -1
вы увидите, эти строки следуют вашей команде.
источник
Вот еще одна реализация прямого доступа:
Это также работает через http, что полезно для локальных архивов пакетов (я знаю: для общедоступных веб-сайтов не рекомендуется делать каталог .git доступным):
источник
Вот еще один способ сделать это с :)
источник
Пример вывода:
ref: refs/heads/master
Разобрать это:
cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"
Если у вас есть окна, то вы можете использовать wsl.exe:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"
Вывод:
refs/heads/master
Это значение может быть использовано позже для git checkout, но оно станет указывать на свой SHA. Чтобы сделать так, чтобы он указывал на текущую текущую ветку по ее имени, выполните:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"
Выходы:
master
источник