Как git связать полное репо

116

Мне нужно перенести полное репо на новый компьютер, не подключенный к сети, предпочтительно как единый файловый объект. Расслоение мерзавца позволяет 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>`.

Так что $ git bundle create repo.bundle --branches --tagsлучше всего подходит клонирование.

$ git bundle create repo.bundle --all предоставит зеркальное отображение вашей исходной машины, включая ее удаленные ссылки.

Филип Окли
источник

Ответы:

191

Как правильно призывать:

  • Объединить все ветки в текущем репо

Просто:

$ git bundle create repo.bundle --all

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

  • Запустите новое репо в целевом каталоге, т.е. правильно установите корневой коммит.

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

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

$ git clone repo.bundle

Это создаст repoрепозиторий git.

Якуб Наребски
источник
6
Спасибо, на --allмоей странице руководства нет параметров bundle(я смотрю на версию 1.7.6.msysgit.0), а также нет использования файла .bundle в разделе URL-адресов для clone. Я с большей уверенностью могу рекомендовать его использование.
Филип Окли
20
Конспект для создания команды является git bundle create <file> <git-rev-list-args>. Бег man git-rev-list(или man git-log) даст вам --all. Но я согласен с тем, что это должно быть более заметно в документации по командам пакета.
Якуб Наребски
1
Я вижу, что на странице руководства по пакету в разделе «Указание ссылок» говорится, что «будут упаковываться только те ссылки, которые показаны с помощью git show-ref», что не включает [list] параметры git-rev-list.
Филип Окли,
2
@Philip Oakley: Вот git-rev-list-argsкак вы выбираете ссылки, которые показываются git show-refкомандой.
Якуб Наребски
2
--allдля меня были включены ветки удаленного отслеживания (git 2.1.4). Я мог видеть refs/remotes/origin/*с помощью git bundle list-heads bundlefileили git ls-remote bundlefile. Хотя вернуть их из комплекта немного сложно.
Alex
33

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

git clone --mirror git@example.org:path/repo.git

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

Тогда беги

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

thoutbeckers
источник
3

Я бы посоветовал вам заархивировать папку .git в tar или zip и просто распаковать ее в новом месте, а затем сделать 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
patthoyts
источник
4
Одно предостережение заключается в том, что вам нужно просмотреть файл .git / config, чтобы проверить, есть ли у исходного владельца репо какие-либо специфические для пользователя данные.
Нуфал Ибрагим
@patthoyts: Учитывая, что он отключен, пультов не будет ;-) Похоже, что в комплекте (возможно) отсутствует опция и, возможно, клон (нужно подумать о клонировании из комплекта)
Филип Окли,