Как выбрать диапазон ревизий git из пустого репозитория в HEAD? - PullRequest
0 голосов
/ 05 октября 2018

Я хочу выбрать диапазон ревизий между пустым репозиторием и HEAD.

(Я действительно понимаю, что это то же самое, что просто смотреть на файлы в HEAD! Однако причина в том, чтоЯ загружаю его во внешний инструмент, который принимает только диапазон ревизий).

Я думаю, что это будет что-то вроде ...

0..HEAD

... но я не могунайти любой пример или документацию по этому.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Первый коммит репозитория можно получить с помощью git rev-list --max-parents=0 HEAD, поэтому для выполнения чего-то вроде 0..HEAD вы можете сделать git log $(git rev-list --max-parents=0 HEAD)..HEAD

Примечание: по умолчанию первый коммит не будет возвращен.Если вы хотите включить первый коммит, вы можете добавить git --boundary log $(git rev-list --max-parents=0 HEAD)..HEAD

0 голосов
/ 05 октября 2018

Вы не можете.Ну, не напрямую, во всяком случае.Набор всех коммитов, достижимых из HEAD, прост: HEAD, выбранный в качестве диапазона ревизий (в отличие от HEAD, выбранный в качестве одного коммита ).Но:

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

Вот где мы имеемпроблема, с довольно хакерским решением.Мы можем проиллюстрировать это с помощью git cherry-pick, потому что git cherry-pick ведет себя по-разному в зависимости от того, назовем ли мы один коммит:

git cherry-pick a123456

или диапазон:

git cherry-pick cafedad..a123456

, например.Первый выбирает (копирует) только один коммит a123456, а второй копирует все коммиты , достижимые с a123456, исключая любые коммиты, достижимые с cafedad.

(Это делаетне делает cherry-pick само по себе плохим, потому что это не очень разумно для cherry-pick, начиная с корневого коммита. Однако, действительно имеет смысл использовать git rebase, начиная с корня, поэтому git rebase -i теперь имеет флаг --root. Проблема немного отличается, но тесно связана.)

То есть предположим, что у нас есть следующая цепочка коммитов:

A--B--C--D--E--F   <-- master
             \
              G--H   <-- branch

с фактическимИдентификатор хеша коммита E равен cafedad, а фактический идентификатор хеша коммита H равен a123456.Если мы хотим скопировать два branch коммита поверх F, мы можем git checkout -b new master получить это:

A--B--C--D--E--F   <-- master, new (HEAD)
             \
              G--H   <-- branch

и затем запустить cherry-pick с синтаксисом диапазона, чтобы получить это:

                 G'-H'  <-- new (HEAD)
                /
A--B--C--D--E--F   <-- master
             \
              G--H   <-- branch

где G' и H' - копии двух интересных коммитов.

Но что если по какой-то причине - это то, где git cherry-pick равно , а не хороший пример - мы хотим скопировать коммиты с A по F включительно?Мы не можем git cherry-pick ..master и даже git cherry-pick badf00d..master, если commit A имеет хэш-идентификатор badf00d.Первый просто копирует F, а второй копирует B-C-D-E-F, опуская A.

Решение состоит в том, чтобы создать отключенный коммит, чтобы мы могли принудительно установить диапазон синтаксис исключая ничего .То есть, если у нас есть:

A--B--C--D--E--F   <-- master
             \
              G--H   <-- branch

, мы можем создать новый коммит I, который находится в совершенно отдельном графике:

A--B--C--D--E--F   <-- master
             \
              G--H   <-- branch

I   <-- independent

Теперь мы можем написать independent..master,что означает все коммиты, работающие в обратном направлении с F, но исключая все коммиты, работающие в обратном направлении с I.Начиная с I и работая в обратном направлении, мы перечисляем commit I: поэтому мы выбросим I из нашего набора F -on-back.Это оставляет нас с выбранными коммитами A-B-C-D-E-F, так как мы хотим.

Итак:

git checkout --orphan independent
git commit -m 'pointless commit made to satisfy external tool'

, после чего мы можем запустить git checkout для обновления HEAD и затем использовать:

external-tool independent..HEAD

, который инструмент увидит в качестве диапазона и сделает выбор диапазона ревизий, который включает все коммиты, достижимые с HEAD, в то же время отбрасывая коммиты ветки, не выбранной в любом случае ("сиротой").

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