Как найти все коммиты, доступные из HEAD, которые были зафиксированы после определенного хэша коммита? - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь получить все файлы, которые были изменены в git, в определенной ветке, начиная с определенного коммита.

Меня не волнует происхождение, только то, что оно доступно из HEAD.

По сути, я пытаюсь составить список файлов, которые были обновлены, изменены и удалены с момента коммита X (поскольку означает дату / время), чтобы я мог что-то делать с этими файлами.

Меня не волнует, технически достижим ли коммит B из коммита A. Меня волнует только то, что коммит B был зафиксирован после коммита A и доступен из HEAD.

Еще один способ подумать о том, что яЯ хочу сделать cp -R для каждого файла, который был добавлен или изменен в репозитории git с даты / времени, когда был выдан конкретный коммит.

В настоящее время я делаю следующее, номне это не кажется правильным:

git log --pretty=oneline --ancestry-path 05de9827fe31905b7ef98f3bbe331e922977de4d..master --date-order

Может кто-нибудь дать мне подсказки / советы о том, как это сделать?Все, что я прочитал о двух- и трехточечной нотации, касается исключения вещей, основанных на достижимости, и это определенно не то, что я хочу.

Однако я также не самый сильный мерзавец, так что если я 'Я неправильно понимаю, что я более чем счастлив узнать об этом.

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Возможный ярлык: помните, что коммиты полные снимки . Все файлы, отличающиеся в подсказке master, от того, что находится в коммите A, можно наблюдать с помощью простого одиночного git diff коммита A против коммита подсказки master. См. ответ Джейка Уорта . Это не покажет файлы, которые были изменены, затем были изменены назад; чтобы получить их, читайте дальше.


Вы правы, что --ancestry-path делает что-то совсем другое:

...--o--A--*--*--*--*   <-- master
                /
    ...--o--o--o

Строка коммитов в нижней строке не является потомком коммита A и будет исключена, но является предком кончика master, и вы, вероятно, захотите включить его.

Помните, что в каждом коммите есть две отметки даты и времени. Это дата автора и дата коммиттера . 1 git log --pretty=fuller покажет обе метки времени для каждого коммита.

Вы можете использовать --since или --min-age, чтобы ограничить ход редакции коммитами, чья временная метка committer превышает какое-либо минимальное значение. Если вас интересуют даты автора , это (намного) сложнее (git rev-list не имеет возможности использовать даты автора).

Мне важно, чтобы коммит B был передан после коммита A и доступен из HEAD.

Нет доступных «отправлено после», так как в коммитах нет даты «отправлено». Коммит может быть сделан пять лет назад (так что его дата коммиттера - 2014) и выдвинут сегодня. (Вы также можете подделать дату коммиттера, и, конечно, даже если вы ее не фальсифицируете, это зависит от правильности часов компьютера.) Но, как правило, люди не связываются со своими временными метками коммиттера, поэтому, если вы доверяете чтобы быть достаточно хорошими, вы можете просто использовать их.

Все, что сказано, вам нужно извлечь метку времени коммиттера из вашего коммита A сначала:

git log --no-walk --pretty=format:%ci A

будет получать метку времени коммиттера в формате ISO-8601. См. Список директив форматирования в документации git log ФОРМАТЫ PRETTY в разделе для различных альтернатив. Парсер даты --since принимает много форм ввода.

(Обратите внимание на проблемы с часовыми поясами, но я забыл, как Git на самом деле решает проблемы с часовыми поясами.)


1 дата автора предназначена для указания, когда изменение было впервые составлено. Дата коммиттера предназначена для хранения времени, в которое был создан конкретный коммит, идентифицированный по хеш-идентификатору коммита. Эти две метки времени изначально одинаковы, но если вы перебазируете или git cherry-pick какой-то коммит, он сохраняет дату своего автора, получая новую (текущую) дату коммиттера в момент перебазирования или копирования вишневого пика (который также получает новый идентификатор хеша коммита).

Из-за всего этого, если коммит был впервые написан месяц назад, но должен был быть пересмотрен несколько раз, прежде чем получить коммит сегодня, у него будет дата автора, которая является одним месяцем, и дата коммиттера «сегодня» ». Следовательно, довольно типично найти дату коммиттера ≥ дату автора.

0 голосов
/ 03 июня 2019

Я не уверен, что это то, что вы ищете, но "Я пытаюсь создать список файлов, которые были обновлены, изменены и удалены, поскольку коммит X" будет поддерживаться --name-only запустить с любого коммита, с которого вы хотели бы оглянуться назад:

$ git diff <commit X SHA> --name-only
file_one
file_two
file_three
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...