Як зібрати повну репо


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 надасть дзеркальне зображення вашої джерельної машини, включаючи віддалений перегляд.

Відповіді:


190

Яке право викликати:

  • Зв’яжіть усі гілки в поточному репо

Простий:

$ git bundle create repo.bundle --all

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

  • Запустіть нове репо в каталозі призначення, тобто правильно встановіть кореневу комісію

По-перше, cloneце просто init+ fetch(+ administrativia).

По-друге, ви можете використовувати файл пакету скрізь, де можна використовувати URL-адресу сховища, так що ви можете просто cloneз файлу пакета:

$ git clone repo.bundle

Це створило б repoсховище git.


6
Дякую, --allпараметри не bundleмістяться на моїй сторінці man (я переглядаю версію 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
Я бачу, що на сторінці "Man's bundle" в розділі "Вказівки посилань" йдеться про те, що "вона буде лише пакетними рефісками, які показані git show-ref", що не включає [список] параметрів списку git-rev.
Філіп Оуклі

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. Хоча повернути їх із пачки - це мало хитро.
Алекс

33

Спочатку клонуйте сховище та включіть --mirrorопцію.

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

Це забезпечує, що всі віддалені розгалужені є також місцевими гілками, готовими до згущення.

Потім бігайте

git bundle create repo.bundle --all як описано у відповіді Якуба Нарбського


3

Я б запропонував вам скористатися папкою та застебнути папку .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

4
Одне застереження полягає в тому, що вам потрібно буде переглянути файл .git / config, щоб перевірити, чи не було у початкового власника репо будь-якого матеріалу.
Нуфал Ібрагім

@patthoyts: Зважаючи на те, що він відключений, пультів не буде ;-) Схоже, в пакеті (може бути) відсутня опція, а може бути і клонувати (потрібно подумати про клонування з пачки)
Philip Oakley
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.