Git клонировать конкретную версию удаленного хранилища - PullRequest
159 голосов
/ 24 августа 2010

Я клонировал удаленный репозиторий git около месяца назад. Удаленный репозиторий претерпел много изменений и теперь стал нестабильным. Теперь мне нужна еще одна копия репозитория, версия, идентичная той, которую я клонировал месяц назад.

Как мне это сделать?

Ответы [ 9 ]

211 голосов
/ 24 августа 2010

Вы можете «сбросить» свой репозиторий на любой коммит, который вы хотите (например, 1 месяц назад).

Используйте git-reset для этого:

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]
72 голосов
/ 04 августа 2013

Вы можете просто использовать

git checkout  commithash

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

git init    
git clone `URLTORepository`
cd `into your cloned folder`
git checkout commithash

коммит хеш выглядит следующим образом: "45ef55ac20ce2389c9180658fdba35f4a663d204"

32 голосов
/ 24 августа 2010

Используйте git log, чтобы найти ревизию, к которой вы хотите выполнить откат, и запишите хэш коммита. После этого у вас есть 2 варианта:

  1. Если вы планируете зафиксировать что-либо после этой ревизии, я рекомендую вам оформить заказ в новую ветку: git checkout -b <new_branch_name> <hash>

  2. Если вы не планируете что-либо фиксировать после этой ревизии, вы можете просто оформить заказ без ветки: git checkout <hash> - ПРИМЕЧАНИЕ: это поместит ваш репозиторий в «отдельную ГОЛОВУ» состояние, которое означает, что в данный момент он не присоединен ни к одной ветви - тогда вам понадобится дополнительная работа для объединения новых коммитов с фактической веткой .

Пример:

$ git log
commit 89915b4cc0810a9c9e67b3706a2850c58120cf75
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:15:01 2010 -0300

    Added a custom extension.

commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:13:48 2010 -0300

    Missing constness.

$ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7'
which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 4553c14... Missing constness.

Таким образом, вы не теряете никакой информации, поэтому вы можете перейти к более новой редакции, когда она станет стабильной.

6 голосов
/ 07 января 2019

Если эта версия, которую вам нужно получить, является либо веткой, либо тегом, то:

git clone -b branch_or_tag_name repo_address_or_path
2 голосов
/ 24 августа 2010

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

Возможно, в то время было тегов , чтобы отметить определенную версию.Если нет, вы можете создать их самостоятельно на месте.Хороший способ сделать это - использовать git log или, возможно, визуально с такими инструментами, как gitk (возможно, gitk --all, чтобы увидеть все ветви и теги).Если вы можете обнаружить хеши коммитов, которые использовались в то время, вы можете пометить их с помощью git tag <hash>, а затем проверить их в новых рабочих копиях (например, git checkout -b new_branch_name tag_name или напрямую с помощью хэша вместо имени тега).

1 голос
/ 03 сентября 2018

Вы можете решить это следующим образом:

git reset --hard sha

где sha Например: 85a108ec5d8443626c690a84bc7901195d19c446

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

git log
0 голосов

uploadpack.allowReachableSHA1InWant

Поскольку Git 2.5.0 эта переменная конфигурации может быть включена на сервере, здесь запрос функции GitHub и фиксация GitHub, включающая эту функцию .

Bitbucket Server включил его с версии 5.5 + .

Использование:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"
0 голосов
/ 31 мая 2016

Возможно git reset решит вашу проблему.

git reset --hard -#commit hash-
0 голосов
/ 24 августа 2010

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

Если вы можете получить этот SHA1, вы можете создать там ветку / сброс, чтобы иметь идентичный репозиторий.

Команды в соответствии с ответом Руи

...