Как клонировать репозиторий 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):
- обычных
git clone
где вы хотите РЕПО (получает все на сегодняшний день-я знаю, не то, что нужно, мы получаем там) -
git checkout <sha1 rev>
из rev вы хотите git reset --hard
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>.