Как git собрать полное репо

Мне нужно перенести полное репо на новый не подключенный к сети компьютер, предпочтительно в виде единого файла. Пакет git позволяет выполнять операции в стиле git fetch, git pull в среде sneakernet, но, похоже, предполагает, что у вас уже есть рабочая версия репо на целевом компьютере.

Как правильно обращаться к

  1. Объедините все ветки в текущем репо
  2. Запустите новый репозиторий в целевом каталоге, то есть правильно установите корневой коммит

Я отправил патч для уточнения:

'git clone' can use any bundle created without negative refspecs
(e.g., 'new', but not 'old..new').
If you want to match 'git clone --mirror', which would clone other
refs such as 'refs/remotes/*', use '--all'.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use '--branches --tags' for
the '<git-rev-list-args>'.

Ответ 1

Каков правильный вызов для:

  • Связывание всех ветвей в текущем репо

Простой:

$ git bundle create repo.bundle --all

Здесь repo.bundle - имя файла пакета, который вы хотите создать. Обратите внимание, что --all не будет включать ветки удаленного отслеживания... так же, как и обычный клон.

  • Запустите новое репо в каталоге назначения, т.е. правильно установите корневую фиксацию.

Во-первых, clone - это просто init + fetch (+ administratorativia).

Во-вторых, вы можете использовать файл связки везде, где может использоваться URL-адрес репозитория, поэтому вы можете просто clone из файла пакета:

$ git clone repo.bundle

Это создало бы repo как репозиторий git.

Ответ 2

Сначала скопируйте репозиторий и включите опцию --mirror.

git clone --mirror [email protected]:path/repo.git

Это гарантирует, что все удаленные ветки также являются локальными ветвями, готовыми для комплектации.

Затем запустите

git bundle create repo.bundle --all, как описано в ответ от Якуба Нарбского

Ответ 3

Я бы предложил вам tar или zip папку .git и просто распакуйте ее в новом месте, а затем сделайте git reset --hard HEAD. Все, что требуется для всех веток, находится под .git, и все, что вам нужно сделать, это настроить любые удаленные файлы в файле .git/config или удалить их.

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD