У ссылок, которые git filter-branch
сообщает как неизмененные, не было файла с именем terra/fixtures.go
нигде в их истории. Фильтр-ветвь информирует вас, что, хотя вы и просили его обновить имена веток, чтобы они указывали на любые скопированные коммиты, в процессе никакие коммиты фактически не копировались.
Может быть интересно найти список доступных хеш-идентификаторов коммитовчто у есть такой файл, а затем запустите git branch --contains
с такими хэш-идентификаторами. См. Ниже.
Какие коммиты содержат файл F?
Обратите внимание, что это другой ответ на другой вопрос. Он также ищет не коммиты, в которых какое-либо имя пути было изменено , а скорее коммиты, в которых какое-то имя пути существует вообще .
Мы начинаем с использования git rev-list
для вывода списка всех коммитов:
git rev-list --all |
Вывод git rev-list
представляет собой просто список хеш-идентификатора каждого коммита, который доступен из названных ревизий. В этом случае --all
называет все ветви и теги вместе с другими ссылками, такими как refs/stash
, но не с записями reflog.
Затем для каждого из перечисленных коммитов мы хотим проверить, содержит ли этот коммитназванный файл (ы). На данный момент вы, как правило, хотите много программируемости. Например, предположим, что имя файла a/b/c.txt
. Вы также хотите найти A/B/C.TXT
? Если вы используете Windows или MacOS, вы можете. Если вы работаете в Linux, вероятно, нет. Или, может быть, вы хотите найти любой файл, имя которого начинается или заканчивается каким-то шаблоном.
Здесь мы будем использовать git ls-tree -r
, в котором перечислены все имена файлов,и затем запустите их с помощью команды поиска и статуса, такой как grep
. Обратите внимание, что grep
ищет регулярных выражений , а не шаблонов глобуса, поэтому a*b
означает ноль или более a
символов, за которыми следует b
символ , и будет соответствовать строкам«abc.txt», «b», «flobby» и т. д.: все они имеют ноль или более a
s, за которыми следует b
. Мы позволим фактическим совпадающим именам проследить, чтобы человек мог применить дополнительную фильтрацию при необходимости:
git rev-list --all |
while read hash; do
git ls-tree -r $hash > /tmp/files
if grep -s 'terra/fixtures\.go' /tmp/files; then
echo "commit ${hash} :"
grep 'terra/fixtures\.go' /tmp/files
fi
done
rm /tmp/files
Вывод этого набора команд, который вы, вероятно, должны поместить в файл, и которыйЯ не проверял и мог содержать ошибки - это список идентификаторов хеша коммитов, которые подходят для извлечения, но за которыми следуют совпадающие имена: вам, вероятно, следует отказаться от совпадений, например, sputerra/fixtures.gobble
.
(возможнонапишите причудливые grep
шаблоны, которые более точно соответствуют. В этом случае привязывает регулярное выражение с ^
и $
. В более сложных случаях требуются более сложные регулярные выражения. Я оставляюэто для тех, кто использует код.)
Получив хеш-идентификаторы - запустите приведенный выше и перенаправьте в файл, очистите файл и извлеките более интересные хеш-идентификаторы - затем вы можете сделать:
git branch --contains <hash>
в любом хэше коммита, чтобы увидеть, какие ветви содержат этот конкретный коммит. Обратите внимание, что может быть ноль или более ветвей, содержащих любой данный коммит. Чтобы (намного) больше об этом, прочитайте и поймите Думайте как (а) Git .