Как я могу получить связанный путь ссылки для git SHA? - PullRequest
2 голосов
/ 28 марта 2010

Я хочу иметь возможность передавать что-либо в команду git (может быть, это SHA, может быть, это просто что-то вроде «origin / master» или «devel / epxerimental» и т. Д.), И git сообщает мне путь ссылки ветви в котором живет что-то переданное, например

<git_command> 0dc27819b8e9 => output: refs/heads/master
<git_command> xyz/test => output: refs/remotes/xyz/master
...

Я смотрел на git show или git log или git rev-parse, и кроме --pretty=format:%d я ничего не мог найти. (Вывод --pretty=format:%d довольно странный с большим количеством свободного места и пустых строк, и иногда на одной строке сгруппированы несколько путей ссылок).

Должен быть лучший способ?

Спасибо за чтение.

Andre

1 Ответ

5 голосов
/ 28 марта 2010

Не существует фиксированной информации, которая бы записывала такие данные, потому что SHA1 не всегда ассоциированы с путем ссылки.
Ветви могут перемещаться, переименовываться или удаляться, в то время как SHA1 все еще будет сохраняться (кроме случаев, когда на него не ссылается ни один шаблон ссылки, он в конечном итоге будет сокращен)

Как говорится:

git show-ref |grep yourSHA1|awk "{print $2}"
git show-ref --heads --tags -d |grep yourSHA1|awk "{print $2}"

очень близко подходит к тому, что ты хочешь:

C:\Prog\Git\tests\rep\main5>git show-ref | grep f4a071 | awk "{print $2}"
refs/heads/master
refs/remotes/origin/HEAD
refs/remotes/origin/master

Для git show-ref доступно множество опций, которые позволят вам:

  • дисплей также разыменовывается SHA1
  • отображать SHA1 только для шаблона ссылок

ОП добавляет:

он вообще ничего не вернет, если переданный SHA не ссылается на заголовок или какой-либо другой разыменованный коммит?
У вас есть идея, как мы могли бы сделать промежуточный шаг, чтобы определить SHA самого последнего коммита, принадлежащего той же ветви, что и пройденный SHA?

Еще одна сантехническая команда, которая может помочь, будет git name-rev:

C:\Prog\Git\tests\rep\main5>git name-rev a7768453
a7768453 patches~1

C:\Prog\Git\tests\rep\main5>git name-rev a7768453|gawk "{gsub(/~.*/,\"\",$2);print $2}
patches

Как Джефроми упоминает в комментариях, фарфоровая команда будет git branch --contain:

C:\Prog\Git\tests\rep\main5>git branch --contain 1e73e369
  master
* patches
  tmp

--contains <commit>

Только списки ветвей, которые содержат указанный коммит.
Он используется для поиска всех ветвей, которые будут нуждаться в особом внимании, если <commit> должны были быть перебазированы или изменены, так как эти ветки содержат указанный <commit>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...