Git: могу ли я непосредственно искать дерево ha sh дерева-i sh, например путь в конкретном c коммите? - PullRequest
0 голосов
/ 01 мая 2020

Представьте себе следующую схему хранилища:

<repo root>
animals/
  ant/
    ...ant-related files...
  bee/
    ...bee-related files...
  dog/
    ...dog-related files...

Я ищу команду типа git please_show_the_tree_hash_of v2.12:animals/ant. Существует ли такая команда; и если да, что это?

Что это за вопрос notabout

У меня есть обходной путь, показанный ниже на случай, если он кому-нибудь поможет. Мой вопрос не об обходном пути, а о том, существует ли подходящая команда Git.

Обнаруженный мной обходной путь - git ls-tree, который не выводит собственный аргумент ha sh, но печатает список своих детей и их хешей. Вы можете вызвать его при коммите нужного дерева-i sh, а затем выполнить grep и нарезать вывод, чтобы получить дерево ha sh пути X в этом коммите.

## -r means 'recurse'
## -d means 'show trees (folders), don't show files'
$ git ls-tree -rd v2.12 | awk '/\tanimals\/ant/ {print $3}'
8ae98d5905e175575c2f56288d79c719c414d834

Итак. Есть ли команда Git, которая при наличии дерева-i sh, такого как mycommit:my/path, напечатает соответствующее дерево ha sh?

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Программа git rev-parse может сделать это легко. Одна из его основных задач - превратить любое имя в Git идентификатор объекта в соответствии с правилами, изложенными в документации gitrevisions :

git rev-parse v2.12:animals/ant

дает вам желаемый идентификатор ha sh здесь.

Как сказано в документации, если вы хотите убедиться, что результирующий объект является конкретно tree объектом (и не один из других видов объектов), вы можете добавить суффикс:

git rev-parse v2.12:animals/ant^{tree}

В некоторых случаях добавление суффикса говорит git rev-parse найти этот конкретный тип объекта. Например, имя ветви всегда разрешается в объект фиксации по умолчанию, но объект фиксации всегда имеет ассоциированное дерево верхнего уровня, поэтому:

git rev-parse master

обычно находит объект фиксации, 1 while:

git rev-parse master^{tree}

находит соответствующее дерево верхнего уровня, содержащее данные моментального снимка для коммита, найденного без суффикса с именем ветви.


1 Случаи, когда этот не не создает фиксацию ha sh ID, включают:

  • , если есть no name master, поэтому что нет способа разрешить имя; или
  • , если сокращенное имя master разрешается в имя тега (по правилу 3, которое предшествует правилу 4, которое разрешит master в имя ветви) и имя тега называет некоторый объект, который не является объектом фиксации.

Имена тегов, такие как v1.2, имеют тенденцию разрешать либо тегировать объекты, либо фиксировать объекты. Следовательно, одна довольно распространенная идиома:

git rev-parse ${name}^{commit}

, чтобы найти объект фиксации, или:

git rev-parse ${name}^{}

, чтобы найти целевой объект, если нужно разрешить аннотированное имя тега разрешить в дерево или капля ха sh. (Пустые фигурные скобки, подобные этой, допускаются для объектов фиксации и не имеют никакого эффекта.)

С осторожностью используйте этот синтаксис для произвольных строк, которые могут включать, например, :/bug123, так как добавление суффикса изменяет строку поиска. Чтобы справиться с этим делом, рассмотрите возможность использования двух git rev-parse шагов:

hash=$(git rev-parse "$1") || exit
hash=$(git rev-parse $hash^{}) || exit
1 голос
/ 02 мая 2020

torek's answer - это то, что вы ищете конкретно, но на всякий случай вот альтернатива, которая делает что-то немного другое и часто очень полезное:

git log --pretty="%T" -1 v2.12 -- animals/ant

производит дерево ha sh из последнего коммита по изменению животных / муравья до v2.12.

  • Вы можете указать любой commit-i sh и любой путь к файлу или каталогу.

    git log --pretty="%T" -1 <commit-ish> -- <path>
    
  • Используйте %t вместо %T, чтобы увидеть сокращенное ha sh. Конечно, вы можете заменить или добавить любой другой код формата , например, %H для коммита га sh и %ai для даты автора.

  • Удалить -1 чтобы увидеть все коммиты через данный commit-i sh, а не только последний.

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