Git: Как клонировать первый коммит? - PullRequest
15 голосов
/ 22 июня 2010

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

Ответы [ 5 ]

14 голосов
/ 20 сентября 2012

Обновлен ответ 2018: используйте свой собственный символьный реф, т.е. тег. И начните использовать describe и аннотированные теги.

git tag -a -m "Initial version" root $( git rev-list --all | tail -n 1 )
git describe

Выходное описание для репо, который никогда не получал тег, но иногда фиксируется с 2011 года с тегом выше:

root-1090-g88a80e93

Если вы хотите отказаться от всей другой истории, с другой стороны, я никогда нужно, достаточно просто скопировать начальный набор. Я могу видеть сценарий использования, если вы хотите сослаться на оригинальный «корневой» коммит и штампы. Может быть, посмотрим, как то есть. BFG работа, --depth или GIT 2.19 его новый clone --filter. [3]


Я думаю, что хочу сделать то же самое. Оформить начальный коммит и перейти оттуда. Я не уверен, что ответ принят. Но я думаю, что это может (частично) полностью ответить на первоначальный вопрос. После прочтения этой темы я, однако, пойду с некоторыми сценариями bash

git log --pretty=oneline  master | tail -1

Я надеялся, что для этого будет какая-то ссылка или коммит. Возможно перечислить узлы, помеченные как root, но я полагаю, что GIT сам по себе не отслеживает это. Таким образом, этот метод работает только в репозитории только с одним корневым коммитом.

Обновления 2017 и 2018 годов заключаются в том, что существует лучший вариант для git log, использующий git rev-list, но с той же проблемой. Они по-прежнему просто используют последний элемент списка коммитов.

Вы можете извлечь 'root commit' для репозитория только с одним root с указанным ниже, и он работает для большинства репозиториев. Но это хак, и было бы лучше проверить вашу систему, почему и где она должна отмечать корневые коммиты. И просто пометьте его или запишите.

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

git checkout $( git rev-list --all | tail -n 1 )

или (GIT <1.8.1): </p>

git checkout $( git log --pretty=oneline | tail -n 1 | sed 's/ .*$//' )

См. git-revlist , а также Используя git, как мне вернуться к первому коммиту, а затем просмотреть историю? .

[3]:

12 голосов
/ 12 марта 2014

Если под «первым коммитом» вы подразумеваете родительский коммит ветви, у которой самих родителей нет, тогда вы хотите использовать для этого git-rev-list. Просто используйте

git rev-list --max-parents=0 HEAD

Это получит ваш «Первоначальный коммит» для текущего заголовка. Используйте master, если вы перечислите, или любую другую дочернюю версию ревизии. оберните это в $(...), чтобы использовать это в выражении, таком как:

git checkout $(git rev-list --max-parents=0 HEAD)

9 голосов
/ 22 июня 2010

Чтобы ответить на вопрос, я думаю, вы хотели спросить:

Вы можете перевести весь ваш репозиторий в состояние первого коммита с помощью:

git checkout <commit SHA1>

После того, как вы закончите возиться, вы можете сделать git checkout master, чтобы вернуться туда, где вы были.

И вы можете получить отдельные файлы в их состоянии с первого коммита с помощью:

git checkout <commit SHA1> <file or directory> ...

Опять же, после того, как вы закончите, вы можете сделать git checkout master <file or directory>, чтобы вернуться туда, где вы были.

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

0 голосов
/ 16 августа 2018

Использовать команду:

git fetch --depth=1 ../testrepo/.git $SHA1

Это клонирует только определенный коммит. Вы можете проверить этот ответ для более подробной информации.

0 голосов
/ 22 июня 2010

Я думаю, что все, что вам нужно сделать, это создать новую ветку из исходного коммита, который вы хотите, проверить это, а затем объединить обратно с HEAD ветви, над которой вы работаете.

Если abcxyz... это SHA1 коммита, который вы хотите, и вы работаете в основной ветке, это обычно то, что вы хотите сделать:

git branch oldskool abcxyz... # creates a new branch called oldskool from the commit
git checkout oldskool
#make changes
git rebase master #bring the oldskool branch up to the HEAD of the master branch (shouldn't overwrite the changes in the files you edited)
git checkout master
git merge oldskool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...