Git: получить конкретную ревизию с удаленного сервера
1117 просмотра
1 ответ
Я настраиваю тест-архитектуру. В этой системе виртуальная машина должна тестировать конкретную версию кода. Виртуальная машина полностью чистая и не имеет локальной (обновляемой) версии репо. Код размещается на локальном git-сервере, поверх ssh, с пользователем по имени git. Я полностью контролирую обе машины.
Простое решение:
git clone --no-checkout git@gitserver:reponame.git
git checkout 8e8fdea8f8367f4a179d2faddbaadba495d6bc12
Это работает, но делает слишком много: передает всю историю по сети, чего я хочу избежать, если это вообще возможно.
Из документации мне кажется, что git clone
может быть выбран --branch
вариант, но это не позволяет мне указывать конкретную ревизию. Если бы это было, это в сочетании с --depth 1
будет работать для меня.
Альтернатива заключается в использовании git archive --remote
. Я понимаю, что для безопасности это позволяет получить произвольные изменения, и в этом случае это не проблема, поэтому я запускаю
git config --global --bool --add uploadArchive.allowUnreachable 1
на сервере git как пользователь git.
Теперь на оболочке пользователя git я могу сделать
git archive --format tar.gz --remote reponame.git 8e8fdea8f8367f4a179d2faddbaadba495d6bc12
Кроме того, с моей виртуальной машины я могу запустить
git archive --format tar.gz --remote git@gitserver:reponame.git master
Однако не работает это:
git archive --format tar.gz --remote git@gitserver:reponame.git 8e8fdea8f8367f4a179d2faddbaadba495d6bc12
remote: fatal: no such ref: 8e8fdea8f8367f4a179d2faddbaadba495d6bc12
remote: git upload-archive: archiver died with error
fatal: sent error to the client: git upload-archive: archiver died with error
И да, я указываю на тот же репо, что ревизия определенно находится в репо, она просто не будет работать с номером ревизии. Одна вещь, которая может иметь место, - то, что, если команды выполняются по ssh, ~/.gitconfig
файл по умолчанию не читается, хотя я не мог найти никакой информации по этому вопросу.
В настоящее время я использую bash в качестве оболочки для пользователя git. В будущем он будет работать с ограниченной оболочкой, но чтобы показать основную проблему, я хотел использовать обычную оболочку.
Меня интересуют как общие замечания о том, как мне получить единственную ревизию на чистой машине, так и решение конкретной проблемы невозможности использования git-архива с ревизией.
РЕДАКТИРОВАТЬ: Торек дал мне несколько идей о версиях (я работаю на OSX, с пакетом git 1.8.5.2 и 2.0.1, установленным через brew), и я сделал небольшой скрипт-обертку, git-upload-archive
чтобы выяснить, что происходит. Скрипт оболочки:
/usr/local/bin/git --version > /tmp/version
tee /tmp/stdin | /usr/local/bin/git-upload-archive "$1" | tee /tmp/stdout
и вызов git-архива с --exec
возможностью запуска этого скрипта.
Версия написана 2.0.1. Однако та же проблема сохраняется ... Локально я могу вызвать git-archive с параметром -remote и sha1, если uploadarchive.allowunreachable
он установлен, удаленно не могу. Интересно, что запрос (в /tmp/stdin
) одинаков в обоих случаях, ответ отличается. Насколько я вижу, это потому, что git-upload-archive не выбирает правильную конфигурацию, если запущен через ssh; это можно показать с помощью локальной конфигурации в репо, и в этом случае это работает (мое замечание в комментариях, что это не сработало, было потому, что я действительно брал /usr/bin/git-upload-archive
; старая версия, которая не позволяет этот флаг конфигурации ).
Проблема может быть решена путем вызова /usr/local/bin/git upload-archive
вместо /usr/local/bin/git-upload-archive
. Это может быть даже предоставлено в качестве аргумента git-archive: --exec='/usr/local/bin/git-upload-archive'
не работает, --exec='/usr/local/bin/git upload-archive'
работает.
Так что проблема работает сейчас. Мне все равно было бы интересно (с академической точки зрения), почему git-upload-archive не берет конфигурацию. Возможно, это ошибка, о которой следует сообщить в проект git.
Автор: Claude Источник Размещён: 12.11.2019 09:53Ответы (1)
1 плюс
На тот случай, если кто-то еще столкнется с этой проблемой: 90% ответа определяется в вопросе в части EDIT. Последние 10%, вероятно, не стоит того, чтобы в них углубляться. Важные моменты я повторяю здесь:
- Позаботьтесь о том, чтобы на OSX Mevericks версия GIT по умолчанию была <2.0, и поэтому не поддерживает
uploadarchive.allowunreachable
тег. При доступе к git через SSH он может выбрать другую версию в зависимости от того, запускаете ли вы интерактивный сеанс SSH или нет (ваш путь может отличаться). git-upload-archive
не проверяетuploadarchive.allowunreachable
флаг в глобальной конфигурации git. Это похоже на ошибку в GIT. Решением является не использованиеgit-upload-archive
, аgit upload-archive
(то есть использование скрипта git с загрузкой-архивом в качестве первого аргумента). Одним из способов сделать это является подача--exec='/usr/local/bin/git upload-archive'
наgit archive
вызов.
Вопросы из категории :
- git Как я могу отменить git reset --hard HEAD ~ 1?
- git Как настроить Git голый доступный по HTTP репозиторий на IIS
- git Как мне отменить неустановленные изменения в Git?
- git Как удалить локальные (неотслеживаемые) файлы из текущего рабочего дерева Git?
- git Как клонировать все удаленные ветки в Git?
- git Частичные коммиты с Subversion
- git-clone Как мне клонировать только подкаталог Git-репозитория?
- git-clone Как вы клонируете репозиторий Git в определенную папку?
- git-clone Загрузите определенный тег с помощью Git
- git-clone Как клонировать одну ветвь в Git?
- git-clone Как клонировать конкретную ветку Git?
- git-archive Сделайте «git export» (например, «svn export»)?
- git-archive Что означает древовидность в Git?
- git-archive Как добавить имя филиала и передать файл вывода git-архива?
- git-archive Git архив с неустановленными изменениями
- git-archive Git: получить конкретную ревизию с удаленного сервера
- git-archive как закрыть ветку в git