2017-02-16 4 views
-1

У меня есть хранилище файлов и файл, который, как я знаю, пришел из него, но я не уверен, в каком теге/ветке. Я знаю имя файла в репозитории.Определите ближайший тег для версии файла в git repostiory

Есть ли простой способ поиска в дереве git, чтобы найти ближайшую ветку/тег, из которого получен файл?

EDIT: полный сценарий, чтобы объяснить, почему.

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

Ускоренная перемотка вперед, мы хотим иметь возможность программно обновлять все места, используя эти шаблоны, но для многих из них мы не знаем, какая версия действительно используется, и какие обновления могут возникнуть в остальная часть кода позволяет легко обновлять обновление. Итак, что мы пытаемся сделать, это выяснить, какой ближайший тег (a-la git описать) будет для конкретной версии конкретного шаблона. Оттуда мы можем организовать остальные обновления по мере необходимости.

У меня есть копия шаблона, я знаю, что это произошло из моего репо, но я не знаю, когда это произошло.

+0

'git log --reverse the-filename'? – Ryan

+0

Это дает мне журнал для коммитов, которые меняют файл, но я бы хотел, чтобы он посмотрел на MD5 и обнаружил, когда этот MD5 впервые появился для этого имени файла. Я предполагаю, что я мог бы перебирать git-log для файла и проверять MD5 на файл при каждой фиксации и видеть, когда он появится. Тем не менее, это не поймает невооруженные ветви. –

+2

Вы хотите ... найти файл по его хэш-файлу MD5? Вы не смешиваете это с идентификаторами фиксации SHA-1 Git's?Вам также нужно будет объяснить, что означает «ближайшая ветка/бирка» ... – Ryan

ответ

1

Итак, у вас есть контент, и вы хотите найти, в какой момент истории это содержимое появилось на заданном пути в репо.

Вы упоминаете что-то о MD5; возможно, вы имели в виду хэш, используемый git (который на самом деле является SHA1), но даже если вы не использовали git's hash, то что использовать. Обратите внимание, что вы не можете использовать какую-либо утилиту для вычисления SHA1, потому что git присоединяет заголовок к контенту, а также может применять некоторые фильтры перед вычислением хэша. Итак:

git hash-object file-containing-the-target-content 

и обратите внимание на SHA1, который он дает.

Далее вам нужен вывод журнала, который включает в себя файл sha1. Один из способов:

git log --raw --no-abbrev --all --full-history --reverse -- path/to/file/in/repo 

и поиск выходных данных для первого вхождения значения sha1, которое вы обнаружили выше. (Может быть, есть способ автоматизировать поиск содержимого, я думаю об этом, но по какой-то причине он не щелкает, а просто записывает журнал или трассирует его на меньшее, а затем ищет значение sha1, будет работать без слишком много проблем.)

И, возможно, это именно то, что вам нужно сделать ... но, честно говоря, я не могу придумать, каким будет приложение для этой техники. Если вы хотите знать, когда определенный запас контента попал в репо, игра с git blame может оказаться более плодотворной.

+0

Вариант этого ... потому что вы что-то сказали в комментариях о несвязанных ветвях, это заставляет меня думать, что вам, возможно, придется иметь дело с тем, было ли содержание введено более одного раза. При выведенном выше выходе журнала каждая запись будет отображать «до SHA1», а затем «после SHA1», чтобы вы могли продолжить поиск каждой строки, где второй SHA1 соответствует вашему целевому контенту. Каждая фиксация, содержащая такую ​​запись, представляет собой фиксацию, которая ввела этот контент. –

+0

Вы можете пропустить вывод 'git log' через' | (экспорт HL = $ (echo -e '\ 033 [41m \ 033 [37m'); export EL = $ (echo -e '\ 033 [0m'); sed "s//$ {HL} \ 0 $ {} EL/г ")'; если вы хотите сохранить раскраску журнала, вам нужно добавить '--color = always' в' git log'. – Pockets

+0

Спасибо, я попробую. Я добавил некоторые дополнительные детали в вопрос, чтобы дать контекст тому, что я ищу и почему. –

0

Я собираюсь опубликовать это отдельно, потому что @ mark-adelsberger доставил мне большую часть пути, но не получил его одним выстрелом. Вот как найти фиксацию файла из его содержимого и получить ближайший тег:

hash=$(git hash-object file_of_unknown_origin) 
commit_hash=$(git log --raw --no-abbrev --all --full-history --reverse --format=format:%H -- path/to/file | sed 's/^:[0-9]* [0-9]* [a-z0-9]* //' | grep -B1 $hash | head -n 1) 
git checkout $commit_hash 
git describe --tags 
Смежные вопросы