Поиск git для уточненной c версии файла - PullRequest
2 голосов
/ 08 января 2020

У меня есть файл, который был скопирован из репозитория git в какой-то момент. Я хочу выяснить, на какой SHA файл был скопирован.

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

Ответы [ 3 ]

3 голосов
/ 08 января 2020

Для меня это выглядит следующим образом:

Скажем, речь идет о файле foo.txt, который был добавлен в репозиторий git (скажем, пустой) в какой-то момент:

touch foo.txt
git add foo.txt
git commit -m "added foo.txt"
// commit '123'

Затем он был изменен пару раз:

// add "hello" to foo.txt
git add foo.txt
git commit -m "Added 'hello'"
// commit '456'
// add "world" to foo.txt
git add foo.txt
git commit -m "Added 'world'"
// commit '789'

В этот момент файл (содержащий «hello world») копируется в сторону (cp foo.txt /tmp/foo.txt) и является его эталонной копией.

Впоследствии были другие коммиты, которые изменили содержимое foo.txt, скажем, коммиты abc, def), так что файл теперь действительно выглядит в git как:

Hello world
How are you doing?
I'm fine, and you?
I'm Ok too

Таким образом, вопрос, который фактически задают, состоит в том, как найти коммит, после которого файл foo.txt выглядит точно как эталонная копия, поскольку он хранится в /tmp/foo.txt: он содержит только «Hello world» (коммит 789 в моем пример)

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

Читать об этом здесь

Вы должны знать, как принять решение, является ли фиксация «хорошей» или «плохой» 'в терминах git bisest (например, содержит ли он слова "привет" и "мир", например)

1 голос
/ 08 января 2020

git hash-object path/to/file покажет вам идентификатор BLOB-объекта для файла в вашем рабочем дереве.

git log --no-abbrev --full-history --cc --raw --pretty=format:%H -- path/to/file будет сбрасывать старый и новый идентификаторы BLOB-объектов при каждом изменении этого файла в вашей истории.

git log --no-abbrev --full-history --cc --raw --pretty=format:%H -- path/to/file \
| awk '$5==blob' RS='' blob=`git hash-object path/to/file`

покажет вам коммиты, которые создали файл, который вы получили.

0 голосов
/ 08 января 2020

Кажется, вы можете использовать git describe для этого.

git describe <sha>

со страницы руководства git describe:

Если данный объект ссылается на BLOB-объект, он будет описан как <commit-ish>:<path>, так что большой двоичный объект может быть найден в <path> в <commit-ish>, который сам описывает первый коммит, в котором этот большой двоичный объект происходит в ходе обратного пересмотра от HEAD.

Чтобы получить <sha> файла, используйте

git ls-files -s <file>

Как указывает Адриан Шум в комментариях, это даст вам только первый коммит, в котором находится файл. Вы можете использовать git log чтобы помочь вам найти следующий коммит, при котором файл изменяется, предоставляя вам диапазон возможных коммитов.

Для получения дополнительной информации:

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