git pull конкретная ревизия из удаленного репозитория


57

У нас есть удаленное git-репо, которое мы обычно развертываем, используя его git pushна нашем dev-сервере, а затем git pullна наших живых серверах, чтобы получить самую последнюю версию репо.

Но если мы зафиксировали и выдвинули несколько ревизий (без « git pullна» на живых серверах), как мы можем сделать то, git pullчто ссылается на старую фиксацию, которую мы хотим?

то есть что-то вроде git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

Ответы:


64

После того, как вы извлекли хранилище, вы сможете перейти:

git checkout 3ef0d...

1
Хорошо, это сработало отлично. Также заметил, что если я хочу вернуться в синхронизацию для будущих пуллов, мне нужно указать удаленный сервер при выполнении следующего git pull server:repogit pull
пулла

1
Возможно, ОП задал неправильный вопрос, но для меня это правильный вопрос, и это не ответ. Существует определенный коммит на сервере, который отсутствует локально. Фиксация не является частью ветви или тега и не передается с извлечением / извлечением. Как получить конкретный коммит?
BlackEye

8

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"

2

Если какой-то процесс на вашем действующем сервере немедленно получает доступ к только что извлеченному контенту (т.е. вы не можете работать с ним git checkout 3ef0dпосле извлечения), вам следует подумать о том, чтобы пометить версию, которую вы хотите развернуть в рабочей среде, и, в частности, получить эту метку в рабочей среде, чтобы вытягивание не происходило немедленно. измените свой рабочий каталог. В противном случае вы рискуете кого-то толкать как раз перед вашим натяжением.


1

Обратите внимание, что git pull git checkout my-old-commit теперь a оставляет вас в состоянии DETACHED HEAD - фактически вы отправляете будущие коммиты в этом хранилище по новому пути коммитов. Для репозитория развертывания это не является серьезной проблемой, поскольку единственными коммитами должны быть коммиты, уже зафиксированные правильно перед извлечением.

Однако иногда полезно проверить, что маркеры фиксации (заголовок, теги, пульты) выглядят идентично главному репо. Чтобы исправить это, выполните следующие действия: git reset - повторно подключите головку git fetch- синхронизируйте маркеры для удаленных устройств [это может зависеть от версии git - по общему признанию, наша среда все еще на 1.7 ... так что, возможно, больше не требуется YMMV]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.