Получить путь к файлу в конкретном коммите в Git - PullRequest
0 голосов
/ 22 мая 2019

У меня есть список идентификаторов коммитов и имен файлов из репозитория git. мне нужно получить путь к файлу каждого файла в списке на основе идентификатора коммита. Но я не знаю, как это сделать с помощью команды git.

Предположим, у меня есть идентификатор фиксации и имя файла: [cb85815bc1, GuiCommonElements.java]. Теперь мне нужен полный путь к файлу в этом идентификаторе коммита. Таким образом, вывод должен быть как path/path/path/GuiCommonElements.java.

Я пробовал много команд, но не дал мне таких результатов.

git show cb85815bc1 --grep='GuiCommonElements.java'
git log cb85815bc1 --grep='GuiCommonElements.java' --name-only

Любая помощь будет оценена.

1 Ответ

3 голосов
/ 22 мая 2019

git show (или git log -p, который делает что-то чрезвычайно похожее, но работает более чем с одним коммитом) diff коммит против его родителя (ей). Добавление --name-only уменьшает вывод diff, чтобы показывать только измененные имена файлов, а не измененные имена файлов плюс набор инструкций.

То, что вы, вероятно, хотите здесь, это использовать git ls-tree, который показывает имена файлов, содержащихся в коммите. Если вы не на верхнем уровне хранилища, git ls-tree по умолчанию показывает только вещи в текущем каталоге, поэтому вы, вероятно, захотите добавить -r --full-tree. Затем вы хотите найти вещи, которые содержат или заканчиваются выбранным вами именем:

git ls-tree -r --full-tree cb85815bc1 | grep GuiCommonElements.java

Это немного ошибочно, так как grep сам принимает аргументы регулярного выражения и показывает совпадающие строки, поэтому он не только отображает файлы вроде:

lib/old/GuiCommonElements.java
lib/new/GuiCommonElements.java

но также:

other/ThisIsNotGuiCommonElements.java

(потому что содержит GuiCommonElements.java) и:

other/GuiCommonElementsXJava

(поскольку . соответствует одному из символов, включая X). Но это, вероятно, достаточно хорошо, и, если хотите, можете немного укрепить его.

Документация git ls-tree утверждает, что она принимает <path>... аргументы, которые являются "шаблонами для сопоставления", но шаблоны глобусов, похоже, здесь не работают: если бы сработали глобусы, '**/GuiCommonElements.java' сработает , но в моем тесте только сейчас они не сделали.

...