Как я могу клонировать git-репозиторий с определенной ревизией, что я обычно делаю в Mercurial:
hg clone -r 3 /path/to/repository
Как я могу клонировать git-репозиторий с определенной ревизией, что я обычно делаю в Mercurial:
hg clone -r 3 /path/to/repository
Ответы:
ОБНОВЛЕНИЕ 2 Поскольку в Git 2.5.0 описанная ниже функция может быть включена на стороне сервера с помощью переменной конфигурации uploadpack.allowReachableSHA1InWant
, здесь запрос функции GitHub и фиксация GitHub включают эту функцию . Обратите внимание, что некоторые серверы Git активируют эту опцию по умолчанию, например, Bitbucket Server включил ее с версии 5.5+ . Посмотрите этот ответ на Stackexchange, чтобы узнать, как активировать опцию конфигурации.
ОБНОВЛЕНИЕ 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 fetch origin <sha1>
работает; кажется, что вам нужно передать именованную ссылку, такую как имя тега или ветви. См. Kerneltrap.org/mailarchive/git/2009/1/13/4707444
git fetch origin <SHA1>
переключатель для переключения на любую ревизию, какую захочу, после того, как получу мастер с пульта и выполнил reset --hard
фактическую инстанцирование ветви локально. Я не смог получить отдельные ревизии напрямую. С git 1.7 git fetch origin <SHA1>
не работал, как сообщает @artur; вам нужно использовать с git checkout <SHA1>
последующим reset --hard
.
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
Чтобы снова вернуться к самой последней фиксации
$ git pull
--depth
что очень важно для больших репозиториев. Это решение требует извлечения всех объектов, а затем возврата к более ранней версии. Это очень много времени и трата пропускной способности сети.
Клонирование репозитория git удачно клонирует весь репозиторий: нет способа выбрать только одну ревизию для клонирования. Однако после выполнения git clone
вы можете оформить конкретную ревизию, выполнив checkout <rev>
.
git clone
захватывает весь репозиторий. Как только вы его получите, вы можете оформить заказ.
git clone --single-branch ...
Для клонирования только одного отдельного коммита в определенной ветви или теге используйте:
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 --depth [N]
где N - это количество оборотов истории, которое вы хотите. Однако:
--depth
Создайте неглубокий клон с историей, усеченной до указанного количества ревизий. Мелкий репозиторий имеет ряд ограничений (вы не можете клонировать или извлекать из него, ни выдвигать, ни извлекать его), но он подходит, если вас интересует только недавняя история большого проекта с длинной историей, и вы хотите отправить исправления в виде исправлений.
Просто подвести итог (git v. 1.7.2.1):
git clone
где вы хотите репо (получает все на сегодняшний день - я знаю, не то, что нужно, мы добираемся там) git checkout <sha1 rev>
вы хотитеgit reset --hard
git checkout -b master
master
и переключается на нее.
git reset --hard
? Документы для этого говорят: «Сбрасывает индекс и рабочее дерево. Любые изменения отслеживаемых файлов в рабочем дереве, так как <commit> [по умолчанию HEAD, который сейчас <sha1 rev>
] отбрасывается». Но на данный момент мы не внесли никаких изменений с момента клонирования, так какова цель? Это обрезает текущую ветку в <sha1 rev>
?
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-репозиторий с определенной ревизией / набором изменений?» ) Помогло мне найти определитель. Если вы хотите клонировать до некоторой точки, то эта точка должна быть тегом / ветвью, а не просто SHA или FETCH_HEAD запутывается. Следуя набору git fetch, если вы используете имя ветви или тега, вы получите ответ, если вы просто используете 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 Удаленный: Подсчет объектов: 45493, сделано. Удаленный: Сжатие объектов: 100% (15928/15928), сделано. удаленный: всего 45493 (дельта 27508), повторно используется 45387 (дельта 27463) Получающие объекты: 100% (45493/45493), 53,64 МиБ | 50,59 МБ / с, готово. Разрешение дельт: 100% (27508/27508), сделано. От / var / www / html / ui * точка отправления ветви -> FETCH_HEAD * [новая ветвь] 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
для загрузки всего лота в его новый дом.
Надеюсь, что это помогает кому-то
git fetch local_copy origin_point
отличаетесь от JamesGs git fetch origin refs/tags/tmptag
?
git fetch local_copy origin_point
Оставить вас в состоянии с пустым reduced-repo
каталогом, только содержащим .git
. В этих инструкциях чего-то не хватает ...
Моя версия была комбинацией принятых и наиболее одобренных ответов. Но это немного отличается, потому что все используют 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>
Я использую этот фрагмент с GNU make, чтобы закрыть любой тег ревизии, ветку или хеш
это было протестировано на git версии 2.17.1
${dir}:
mkdir -p ${@D}
git clone --recursive --depth 1 --branch ${revison} ${url} ${@} \
|| git clone --recursive --branch ${revison} ${url} ${@} \
|| git clone ${url} ${@}
cd ${@} && git reset --hard ${revison}
ls $@
git clone https://github.com/ORGANIZATION/repository.git
(клонировать хранилище)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
# clone special tag/branch without history
git clone --branch=<tag/branch> --depth=1 <repository>
# clone special revision with minimal histories
git clone --branch <branch> <repository> --shallow-since=yyyy-MM-ddTHH:mm:ss # get the commit time
cd <dir>
git reset --hard <revision>
Вы не можете получить ревизию без историй, если она не установлена uploadpack.allowReachableSHA1InWant=true
на стороне сервера, тогда как вы можете создать для нее тег и клонировать специальный тег.
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>.
--depth=1
не упоминается в ответе, так почему вы сказали бы, что этот ответ сработал, если вы добавили больше вещей, которые здесь не упомянуты? Я рад, что это сработало для вас, но этот ответ вводит в заблуждение и не отвечает на вопрос даже частично. Отсюда и недостатки.
git clone <url> <local_dir_name>
, просто попробуйте сами. Единственное отличие состоит в том, что удаленный (показанный с использованием git remote
) будет называться некой загадочной последовательностью sha1 вместо обычного имени «origin». Другими словами, <sha1-of-the-commit>
упомянутое в этом ответе не имеет никакого отношения к тому, какие ревизии выбираются с сервера или какая ветвь будет проверена.
git clone -o 896066ee1cf4d653057dac4e952f49c96ad16fa7 https://github.com/torvalds/linux.git linux --depth=1
. Это дает мне пересмотр, 8a28d674
а не 896066ee
как вы и этот ответ утверждает.
git clone -b 10.1 https://github.com/MariaDB/server.git --depth=1 mariadb-server-src