Как клонировать репозиторий git с определенной редакцией / набором изменений?

Как я могу клонировать репозиторий git с определенной редакцией, как я обычно делаю в Mercurial:

hg clone -r 3 /path/to/repository

13 ответов


обновление 2 С Git 2.5.0 функция, описанная ниже, может быть включена на стороне сервера с переменной конфигурацией uploadpack.allowReachableSHA1InWant здесь запрос функции GitHub и GitHub commit включение этой функции. Обратите внимание, что некоторые серверы Git активируют эту опцию по умолчанию, например Bitbucket Server включил его с версия 5.5+. Смотрите это ответ на Stackexchange для exmple, как активируйте параметр конфигурации.

обновление 1 для версий Git 1.7 < v < 2.5 используйте git clone и git reset, как описано в Вэбов Баджпаи это

если вы не хотите получать полный репозиторий, то вы, вероятно, не должны использовать clone. Вы всегда можете просто использовать fetch, чтобы выбрать ветку, которую вы хотите получить. Я не эксперт по hg, поэтому я не знаю деталей -r но в Git, вы можете сделать что-то подобное этот.

# make a new blank repository in the current directory
git init

# add a remote
git remote add origin url://to/source/repository

# fetch a commit (or branch or tag) of interest
# Note: the full history up to this commit will be retrieved unless 
#       you limit it with '--depth=...' or '--shallow-since=...'
git fetch origin <sha1-of-commit-of-interest>

# reset this repository's master branch to the commit of interest
git reset --hard FETCH_HEAD

$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

чтобы снова вернуться к самой последней фиксации

$ git pull

клонирование репозитория git, точно, клонирует весь репозиторий: нет способа выбрать только одну ревизию для клонирования. Однако, как только вы выполните git clone, вы можете проверить конкретную ревизию, выполнив checkout <rev>.


Если вы имеете в виду, что хотите получить все с самого начала до определенного момента, ответ Чарльза Бейли идеален. Если вы хотите сделать обратное и получить подмножество истории, начиная с текущей даты, вы можете использовать git clone --depth [N] где N - количество оборотов истории, которое вы хотите. Однако:

--глубина

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


чтобы подвести итог (git V. 1.7.2.1):

  1. обычных git clone где вы хотите РЕПО (получает все на сегодняшний день-я знаю, не то, что нужно, мы получаем там)
  2. git checkout <sha1 rev> из rev вы хотите
  3. git reset --hard
  4. git checkout -b master

TL; DR-просто создайте тег в исходном репозитории против фиксации, которую вы хотите клонировать, и используйте тег в команде fetch. Вы можете удалить тег из исходного РЕПО позже, чтобы очистить.

ну, его 2014, и похоже, что принятый ответ Чарльза Бейли с 2010 года хорошо и действительно устарел к настоящему времени и большинство (все?) другие ответы включают клонирование, которого многие люди надеются избежать.

следующее решение достигает того, что OP и многие другие ищут, что является способом создания копии репозитория, включая историю, но только до определенной фиксации.

вот команды, я использовал с Git версии 2.1.2 для клонирования локального РЕПО (т. е. репозиторий в другом каталоге) до определенного момента:

# in the source repository, create a tag against the commit you want to check out
git tag -m "Temporary tag" tmptag <sha1>

# create a new directory and change into that directory
cd somewhere_else;mkdir newdir;cd newdir

# ...and create a new repository
git init

# add the source repository as a remote (this can be a URL or a directory)
git remote add origin /path/to/original/repo

# fetch the tag, which will include the entire repo and history up to that point
git fetch origin refs/tags/tmptag

# reset the head of the repository
git reset --hard FETCH_HEAD

# you can now change back to the original repository and remove the temporary tag
cd original_repo
git tag -d tmptag

надеюсь, это решение будет работать еще несколько лет! :-)


вы можете использовать просто git checkout <commit hash>

в этой последовательности

bash git clone [URLTORepository] git checkout [commithash]

фиксация хэша выглядит так: "45ef55ac20ce2389c9180658fdba35f4a663d204"


используя 2 из приведенных выше ответов (как клонировать репозиторий git с определенной редакцией / набором изменений? и как клонировать репозиторий git с определенной редакцией / набором изменений?) Помог мне придумать definative. Если вы хотите клонировать до точки, то эта точка должна быть тегом/ветвью, а не просто SHA или fetch_head запутывается. После набора выборки git, если вы используете имя ветви или тега, вы получаете ответ, если вы просто используете SHA-1, Вы не получаете ответ.
Вот что я сделал:- создайте полный рабочий клон полного РЕПО из фактического источника

cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git 

затем создайте локальную ветку, в точке, которая интересна

git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point

затем создайте мое новое пустое РЕПО с моей локальной копией в качестве источника

cd <path to create repo>
mkdir reduced-repo
cd reduced-repo
git init
git remote add local_copy <path to create repo>/ui
git fetch local_copy origin_point

в этот момент я получил такой ответ. Я отмечаю это, потому что если вы используете SHA-1 вместо ветви выше, ничего не происходит, поэтому ответ означает это работал

/var/www/html/ui-hacking$ git fetch local_copy origin_point
remote: Counting objects: 45493, done.
remote: Compressing objects: 100% (15928/15928), done.
remote: Total 45493 (delta 27508), reused 45387 (delta 27463)
Receiving objects: 100% (45493/45493), 53.64 MiB | 50.59 MiB/s, done.
Resolving deltas: 100% (27508/27508), done.
From /var/www/html/ui
 * branch            origin_point -> FETCH_HEAD
 * [new branch]      origin_point -> origin/origin_point

теперь в моем случае мне нужно было вернуть это на gitlab, как новое РЕПО, поэтому я сделал

git remote add origin git@<our gitlab server>:ui-developers/new-ui.git

что означало, что я мог перестроить свое РЕПО из origin_point, используя git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k гадать удаленно, а затем использовать git push origin чтобы загрузить всю партию обратно в свой новый дом.

надеюсь, что это поможет кому-то


моя версия была комбинацией принятых и наиболее одобренных ответов. Но это немного отличается, потому что все используют SHA1, но никто не говорит вам, как его получить

$ git init
$ git remote add <remote_url>
$ git fetch --all

Теперь вы можете увидеть все ветви и коммиты

$ git branch -a
$ git log remotes/origin/master <-- or any other branch

наконец, вы знаете SHA1 желаемой фиксации

git reset --hard <sha1>

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

$ git clone repo
$ git checkout -b newbranch
$ git branch --set-upstream-to=origin/branch newbranch
$ git pull

вот и все


git clone https://github.com/ORGANIZATION/repository.git (клонировать репозиторий)

cd repository (navigate to the repository)

git fetch origin 2600f4f928773d79164964137d514b85400b09b2

git checkout FETCH_HEAD


клонировать только один конкретный commit на конкретной ветке или теге используйте:

git clone --depth=1 --branch NAME https://github.com/your/repo.git

к сожалению, NAME может быть только имя ветви или имя тега (не фиксировать SHA).

пропустить --depth флаг, чтобы загрузить всю историю, а затем проверить эту ветку или тег:

git clone --branch NAME https://github.com/your/repo.git

это работает с последней версией git (я сделал это с версией 2.18.0).


git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>

git использует слово origin вместо общеизвестного revision

Ниже приведен фрагмент из руководства $ git help clone

--origin <name>, -o <name>
    Instead of using the remote name origin to keep track of the upstream repository, use <name>.