Имея файл, могу ли я проверить, существует ли идентичный файл в истории git-репо? - PullRequest
4 голосов
/ 24 июня 2019

Имея git-репозиторий с файлом foo.c и произвольный файл, могу ли я проверить, существует ли когда-либо указанный файл с идентичным содержимым, равным foo.c в репозитории?

То есть, учитывая некоторую копию файла foo.c Я хочу проверить, существовало ли когда-либо такое (идентичное по байту) foo.c в хранилище.

Ответы [ 3 ]

1 голос
/ 24 июня 2019

Конечно. git log --raw показывает старый и новый ша на каждом измененном пути, возможно, самый простой вывод, через который будет проходить лапа, будет

git log --raw --no-abbrev --all -m --pretty=format:%H

и охота за тобой в этом.

Если «некоторая копия файла foo.c» означает, что вы не обязательно хотите добавить это foo.c в репозиторий, вы можете получить шас для произвольного контента, например, с помощью. git hash-object foo.c, иначе git rev-parse может отыскать любой существующий идентификатор.

Так что-то вроде

git log --raw --no-abbrev --all -m --pretty=format:%H \
| awk 'NF==1 {commit=$1} $4==thehash{print commit,$0}' thehash=`git hash-object foo.c`
1 голос
/ 24 июня 2019

Простым подходом было бы:

git cat-file -t $(git hash-object path/to/foo.c)`  # Assuming bash syntax...

Это вывело бы blob, если какой-либо файл, идентичный foo.c, был зафиксирован в репо (независимо от пути / имени файла), иfatal: git cat-file: could not get object info если его нет в репо.

Он вычисляет хэш sha-1 вашего входного файла path/to/foo.c, затем запрашивает тип объекта git, идентифицируемый этим хешем, которыйвыдает сообщение об ошибке, если файл не существует в базе данных объектов git.

Недостатком является то, что он просто отвечает на вопрос, существует ли файл в репо.
Он не сообщает вам путьсоответствующий файл, или которые фиксируют / фиксируют, которые содержат соответствующий файл.

1 голос
/ 24 июня 2019

Найдите файл с git log --all -- foo.c или, возможно, git rev-list --all | xargs -I '{}' git ls-tree --full-tree -r '{}' | grep 'foo.c'.Затем вы можете сравнить хэши с git ls-files -s foo.c для одного в git-репо и git hash-object foo.c для одного в вашей файловой системе, просто чтобы убедиться, что это тот же файл.

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