2011-02-15 2 views
1

В Perforce вы можете создать clientpec (рабочее пространство) и использовать опцию «-p» при синхронизации кода Perforce. Таким образом, он не затрагивает таблицу файлов на сервере Perforce и делает синхронизацию намного быстрее. Это в основном копирование и вставка файлов с сервера Perforce.Эквивалентность Perforce «p4 sync -p ... @ Changelist» в Git

Мы экспериментируем с такой операцией на стороне Git, но не смогли найти точную копию этой команды Perforce.

Есть ли эквивалентность этого?

Я знаю, что git reset --hard <commit> будет работать, но это если вы уже использовали git clone и получили локальную копию файлов. В наших случаях предположим, что мы никогда не запускаем git clone на локальном компьютере.

Я прошу в этой ситуации, потому что я делаю сборку SCM, и исходный код от Git нужно синхронизировать с машиной сборки на определенной SHA, но в прошлом не было git clone.

Спасибо.

ответ

0

git не предназначен для получения только версии файлов, но история. Есть ли действительно проблема с выполнением git clone и git fetch, когда должны произойти обновления? Обновления используют diff, поэтому это может быть намного быстрее, чем копирование всех файлов, а репозиторий git часто не намного больше, чем текущее состояние.

Тем не менее, есть несколько подходов, чтобы не копировать всю историю:

  1. git clone --depth 1 будет получить только недавнюю историю, но она по-прежнему получает все ветви. Это также не очень полезный клон, так как многие обычные операции не будут работать. Это не может быть проблемой в вашем случае использования.
  2. Вы можете создать эфемерную ветвь с одним фиксатором, у которого есть состояние, которое вы хотите скопировать. Затем клиент делает git init; git remote add -t <branch> origin <url>; git fetch origin/branch; git checkout origin/branch
  3. git archive может создавать моментальный снимок, который можно загрузить как отдельный файл, а затем извлечь.
+0

'мерзавец клон --depth = 1' является то, что я сначала проверял, но он не работает хорошо потому что он всегда получает HEAD. Это не то, что может сделать наша текущая машина SCM. – xbeta

+0

вариант # 2 в порядке, но мы говорим о 20 сборках каждый день в разное время, при разных изменениях (SHA) – xbeta

+0

для варианта № 3, насколько быстро запускается 'git archive'? 'git clone --depth = 1' обычно занимает около 2 минут, чтобы скачать наш источник в оптимальной ситуации. – xbeta

4

Вы можете настроить ГИТ-демон, чтобы сервис «загрузить-архив» (см ГИТ-демон справочную страницу), и это позволяет клиенту просто запросить архив конкретного снимка из репозитория Git, используя команду git archive --remote, вместо того, чтобы загружать всю базу данных.

например. это загрузить снимок какого-либо проекта под названием «cmstool» в версии 1.0.0 с удаленного сервера:

git archive --format=tar \ 
      --prefix=cmstool-1.0.0/ \ 
      --remote=git://git/cmstool.git v1.0.0 | tar xf - 
+1

Обратите внимание, что это лучший способ сделать это, если вы согласны никогда не использовать git-подмодули. Вы не можете запустить init/update git subodule при проверке, выполненной с использованием git-архива, так как метаданные git не будут доступны. –

+0

Я думаю, вы могли бы написать что-то, чтобы посмотреть на загруженный файл .gitmodules и использовать его для рекурсивного подбора подмодулей? Это, безусловно, значительно усложняет сложность, поскольку это практически однострочный. – araqnid

Смежные вопросы