Повністю створити резервну копію git repo?


136

Чи є простий спосіб створити резервну копію цілого git repo, включаючи всі гілки та теги?


2
Я думаю, ви посилаєтесь на місцевий git repos тут.
Ztyx


3
Правильна відповідь - зробити: git clone --mirror git@example.com/your-repo.git Це скопіює все ваше сховище, нотатки, гілки, відстеження тощо
Джон

Деякі веб-пошуку, які я проводив, не включали це питання у свої результати: "git клонує абсолютно все, що відмічає теги нотатки"; "git клонує все у сховищі"; "git clone repo з усіма примітками тегів".
Кенні Евітт

Відповіді:


64

Що про те, щоб просто зробити його клоном?

git clone --mirror other/repo.git

Кожне сховище - це резервна копія його віддаленого пристрою.


7
@Daniel: Якщо ви клонуєте сховище, ви отримуєте кожну гілку, але перевіряється лише стандартна. Спробуйте git branch -a. Може бути, більш очевидним є такий спосіб: після клонування сховища ви не отримуєте кожну гілку, ви отримуєте кожну комісію. Гілки посилаються лише на існуючий комітет.
KingCrunch

1
Я думаю, що він добре знає команду клонування, якщо він може задати таке запитання, і йому явно недостатньо (бо це клон, а не смітник). Дампи - це різні речі, як прості копії, наприклад: 1) вони не потрібні, щоб бути оптимальними (або навіть здатними) для нормальної роботи 2), але вони повинні мати хороший опір і ремонтопридатність проти корупції даних.
петерх

@peterh Звичайно, але git cloneохоплює все це. (1) є необов'язковим, а не вимогою. Якщо результат все-таки оптимізований, все одно резервна копія (2) вже покрита самим git. - Я хотів би сказати, що якщо ви git cloneвже охоплюєте відповідні пункти, для чого вам потрібен інший інструмент? Хоча я також вважаю за краще, git bundleя не вважаю, що моя відповідь неправильна чи недійсна. Ви можете бачити обидва підходи як резервне резервне копіювання.
KingCrunch

як щодо дозволів на файли? клон git обов'язково копіює їх? залежить від варіантів, які я вважаю
антиреалізм

192
git bundle

Мені подобається цей метод, оскільки в результаті виходить лише один файл, який легше копіювати.
Дивіться ProGit: маленький пучок радості .
Дивіться також " Як я можу надіслати кому-небудь репозиторій git? ", Де команда

git bundle create /tmp/foo-all --all

докладно:

git bundleбуде містити лише посилання на пакет, які показані git show-ref : сюди входять голови, теги та віддалені головки.
Дуже важливо, щоб основу використовували місце призначення.
Добре помилятися на стороні обережності, викликаючи, щоб файл групи містив об’єкти, які вже є в пункті призначення, оскільки вони ігноруються при розпакуванні в пункті призначення.


Для використання цього пакету ви можете його клонувати, вказавши неіснуючу папку (поза будь-яким git repo):

git clone /tmp/foo-all newFolder

11
додати --all для повного резервного копіювання
sehe

1
Це git bundleправильна відповідь на мою думку, а не прийнята. Я думаю, що він добре знає команду клонування, якщо він може задати таке запитання, і йому явно недостатньо (бо це клон, а не смітник). Дампи - це різні речі, як прості копії, наприклад: 1) вони не потрібні, щоб бути оптимальними (або навіть здатними) для нормальної роботи 2), але вони повинні мати хороший опір і можливість відновлення даних проти корупції даних 3) Це часто корисно якщо вони легко розрізнюються для додаткового резервного копіювання, тоді як копія не є ціллю.
peterh

3
Зауважте, що ні git bundleабо не git cloneотримує все , наприклад, сценарії гаків.
Zitrax

2
@Zitrax Так, це за задумом. Гачки можуть бути небезпечними або включати конфіденційну інформацію.
VonC

Чи можу я використовувати git bundleпроти віддаленого репо?
Райан Шиллінгтон

24

Розширюючи деякі інші відповіді, це те, що я роблю:

Налаштування репо: git clone --mirror user@server:/url-to-repo.git

Потім, коли ви хочете оновити резервну копію: git remote updateз місця клонування.

Це створює резервну копію всіх гілок і тегів, включаючи нові, які будуть додані пізніше, хоча варто відзначити, що гілки, які видаляються, не видаляються з клону (що для резервної копії може бути хорошою справою).

Це атомно, тому не має проблем, які складе проста копія.

Див. Http://www.garron.me/en/bits/backup-git-bare-repo.html


20

Розкриваємо чудові відповіді KingCrunch та VonC

Я поєднав їх обох:

git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all

Після цього у вас є названий файл, reponame.bundleякий можна легко скопіювати. Потім ви можете створити нове звичайне сховище git із цього, використовуючи git clone reponame.bundle reponame.

Зауважте, що git bundleлише копії комісій, які призводять до деякої посилання (гілки чи тегу) у сховищі. Таким чином, зв'язування комітетів не зберігається в розшаруванні.


1
Гарне резюме. +1.
VonC

2
Я думаю, ти мав на увазі git bundle create reponame.bundle --all?
Джо

Дякую @joe, що помітили це. Безумовно. Я оновлю відповідь.
Кіммо

4

Все міститься в .gitкаталозі. Просто поверніть це разом зі своїм проектом, як і будь-який файл.


2
Чи означає це, що достатньо лише резервного копіювання ВСІХ вмісту каталогу, що містить проект Git?
Равіндранат Акіла

1
Погоджено з Сунілом - це, схоже, не є атомною операцією.
jia103

1
І як ви гарантуєте, що під час створення резервної копії файлів у цьому каталозі не вносяться зміни?
Raedwald

Як натякнув Редвальд, цей метод може призвести до непослідовної резервної копії і, отже, призвести до втрати даних. Отже, цю відповідь слід усунути або, принаймні, попередити про можливість втрати даних.
Абхішек Ананд

Я думаю, що він дуже добре знає copyабо cpкомандує, і це не відповідає його потребам. І я також думаю, що він думає про голому сховищі (хоча це теж можна скопіювати, я думаю, що це не повноцінне резервне копіювання).
петерх

4

використовувати git bundle або клон

копіювання каталогу git не є гарним рішенням, оскільки воно не є атомним. Якщо у вас є великий сховище, яке копіюватиме тривалий час, і хтось натисне на ваше сховище, це вплине на вашу резервну копію. Клонування або створення пакету не матиме цієї проблеми.


3

Можна створити резервну копію git repo за допомогою git-copy при мінімальному розмірі пам’яті.

git copy /path/to/project /backup/project.repo.backup

Тоді ви можете відновити свій проект за допомогою git clone

git clone /backup/project.repo.backup project

2
github.com/cybertk/git-copy/blob/master/bin/git-copy#L8-L36 : це здається багато роботи для простого git clone --bare+ git push --force.
VonC

@VonC Так, але він може мати додаткову функцію під час перепакування, або він може видобути внутрішню структуру git repo, яку він може використовувати для оптимізації (реструктуризація пункту призначення, збільшення швидкості тощо).
петерх

3

Правильна відповідь ІМО - це git clone --mirror . Це повністю створить резервну копію вашого репо.

Дзеркало клонування Git буде клонувати все сховище, нотатки, заголовки, рефлекси тощо, і зазвичай використовується для копіювання всього сховища на новий git-сервер. Це знищить усі гілки і все, все сховище.

git clone --mirror git@example.com/your-repo.git
  • Зазвичай клонування репо не включає всі гілки, лише Майстер.

  • Копіювання папки repo "копіює" лише ті гілки, які витягнули ... тож за замовчуванням це лише гілка Master або інші гілки, які ви попередньо перевірили.

  • Команда Git bundle також не є тим, що ви хочете: "Команда bundle буде пакувати все, що зазвичай буде натиснуто по дроту командою git push, у двійковий файл, який ви можете комусь надіслати електронною поштою або поставити на флешку. Потім роз'єднати в інше сховище. " (Від чого різниця між git clone --mirror та git clone --bare )


Чи створює git clone --mirror послідовне резервне копіювання часу? Що користувач підштовхує комісію під час створення резервної копії? Це відхилено, у черзі чи включено до резервної копії?
Бенджамін Годакре

3

Цей потік був дуже корисним для отримання деякої інформації про те, як можна зробити резервні копії git repos. Я думаю, що все ще не вистачає деяких підказок, інформації чи висновку, щоб знайти «правильний шлях» (tm) для себе. Тому я ділюсь своїми думками, щоб допомогти іншим, і викладу їх на обговорення, щоб покращити їх. Дякую.

Отже, починаючи з підбору оригінального питання:

  • Мета - максимально наблизитись до "повного" резервного копіювання сховища git.

Потім збагатити його типовими побажаннями та вказати деякі попередні налаштування:

  • Резервне копіювання за допомогою "гарячої копії" бажано уникати простоїв служби.
  • Недоліки git будуть подолані додатковими командами.
  • Сценарій повинен робити резервну копію, щоб поєднати кілька кроків для однієї резервної копії та уникнути помилок людини (помилки друку тощо).
  • Крім того, сценарій повинен виконати відновлення, щоб адаптувати дамп до цільової машини, наприклад, навіть конфігурація оригінальної машини може змінитися після резервного копіювання.
  • Environment - це сервер git на машині Linux з файловою системою, яка підтримує жорсткі посилання.

1. Що таке "повна" резервна копія git repo?

Точка зору відрізняється від того, що таке "100%" резервна копія. Ось два типові.

№ 1 Точка зору розробника

  • Зміст
  • Список літератури

git - це інструмент для розробників і підтримує цю точку зору через git clone --mirrorта git bundle --all.

№2 Точка зору адміністратора

  • Файли вмісту
    • Спеціальний випадок "packfile": git поєднує та ущільнює об'єкти в packfiles під час вивезення сміття (див. git gc)
  • конфігурація git
    • дивись https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain
    • docs: man git-config, man gitignore
    • .git / config
    • .git / опис (для гачків та інструментів, наприклад, гачок після одержання електронної пошти, гітоліт, GitWeb тощо)
    • .git / гачки /
    • .git / info / (файл сховища виключає тощо)
  • Необов’язково: конфігурація ОС (дозволи файлової системи тощо)

git - це інструмент для розробників і залишає це адміністратору. Резервне копіювання конфігурації git та конфігурації ОС слід розглядати як відокремлене від резервного копіювання вмісту.

2. Техніки

  • "Cold-Copy"
    • Зупиніть сервіс, щоб мати ексклюзивний доступ до його файлів. Час простою!
  • "Гаряча копія"
    • Служба забезпечує фіксований стан для цілей резервного копіювання. Постійні зміни не впливають на цей стан.

3. Інші теми, над якими потрібно задуматися

Більшість із них є загальними для резервного копіювання.

  • Чи є достатньо місця для повного резервного копіювання? Скільки поколінь буде зберігатися?
  • Чи потрібен поступовий підхід? Скільки поколінь буде зберігатися і коли знову створити повну резервну копію?
  • Як переконатися, що резервна копія не пошкоджена після створення чи з часом?
  • Чи підтримує файлова система жорсткі посилання?
  • Покласти резервну копію в один архівний файл або використовувати структуру каталогів?

4. Що git надає для резервного копіювання вмісту

  • git gc --auto

    • docs: man git-gc
    • Очищає та ущільнює сховище.
  • git bundle --all

    • docs: man git-bundle, man git-rev-list
    • Atomic = "Гаряча копія"
    • Пакети - це дамп-файли і їх можна безпосередньо використовувати з git (перевірити, клонувати тощо).
    • Підтримує поступовий видобуток.
    • Перевіряється через git bundle verify.
  • git clone --mirror

    • docs: man git-clone, man git-fsck, у чому різниця між git-клоном --mirror та git clone --bare
    • Atomic = "Гаряча копія"
    • Дзеркала - справжні сховища git.
    • Основна мета цієї команди - створити повне активне дзеркало, яке періодично отримує оновлення з оригінального сховища.
    • Підтримує жорсткі посилання на дзеркала в одній і тій же файловій системі, щоб уникнути витрачання місця.
    • Перевіряється через git fsck.
    • Дзеркала можуть бути використані як основа для повноцінного скрипта резервного копіювання файлів.

5. Холодна копія

Резервне копіювання в холодному режимі завжди може зробити повне резервне копіювання файлів: відмовити у всіх доступах до git repos, зробити резервну копію та знову дозволити доступ.

  • Можливі проблеми
    • Може бути непростим - а то й можливим - забороняти всі звернення, наприклад, спільний доступ через файлову систему.
    • Навіть якщо репо є на клієнтській машині з одним користувачем, користувач все одно може зробити щось під час автоматичного запуску резервного копіювання :(
    • Час простою може бути неприйнятним на сервері, і робити резервну копію кількох величезних репостів може зайняти багато часу.
  • Ідеї ​​для пом’якшення:
    • Не допускайте прямого репо-доступу через файлову систему загалом, навіть якщо клієнти знаходяться на одній машині.
    • Для доступу до SSH / HTTP використовуйте диспетчери авторизації git (наприклад, gitolite) для динамічного управління доступом або модифікації файлів аутентифікації сценарієм.
    • Резервне копіювання репо-копій, щоб зменшити час простою для кожного репо-файлу. Заборонити одну репосту, зробити резервну копію та знову дозволити доступ, а потім продовжити наступне репо.
    • Сплануйте графік технічного обслуговування, щоб уникнути засмучення розробників.
    • Резервне копіювання лише тоді, коли сховище змінено. Можливо, дуже важко реалізувати, наприклад, список об'єктів, плюс пам’яті з пакетами, контрольні суми конфігурацій та гаків тощо.

6. Гаряча копія

Резервне копіювання файлів не може бути виконано за допомогою активних репозицій через ризик пошкодження даних, що надходять у дію. Гаряча копія забезпечує фіксований стан активного сховища для цілей резервного копіювання. Постійні комісії не впливають на цю копію. Як зазначено вище, функції клонування та пакету git підтримують це, але для резервного копіювання "100% адміністратора" декілька речей потрібно зробити за допомогою додаткових команд.

"100% адміністратор" резервного копіювання гарячої копії

  • Варіант 1: використовувати git bundle --allдля створення повних / поступових дамп-файлів вмісту та файлів конфігурації копіювання / резервного копіювання.
  • Варіант 2: використовувати git clone --mirror, обробляти та копіювати конфігурацію окремо, а потім зробити повне резервне копіювання файлу дзеркала.
    • Примітки:
    • Дзеркало - це нове сховище, яке заповнене поточним шаблоном git при створенні.
    • Очистіть конфігураційні файли та каталоги, а потім скопіюйте конфігураційні файли з оригінального сховища.
    • Сценарій резервного копіювання може також застосовувати конфігурацію ОС, як дозволу на файл на дзеркалі.
    • Використовуйте файлову систему, яка підтримує жорсткі посилання та створіть дзеркало в тій же файловій системі, що і джерело сховища, щоб отримати швидкість і зменшити витрату місця під час резервного копіювання.

7. Відновити

  • Перевірити та прийняти конфігурацію git для цільової машини та останньої філософії "способу роботи".
  • Перевірити та прийняти конфігурацію ОС, щоб орієнтуватися на машину та останню філософію "способів роботи".

0
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master

це створює резервну копію і робить налаштування, так що ви можете робити git push для оновлення резервної копії, що, мабуть, те, що ви хочете зробити. Просто переконайтеся, що / path / to / backupdir та / path / to / repo є принаймні різними жорсткими дисками, інакше це не має такого великого сенсу.


Я думаю, що він добре знає команду клонування, якщо він може задати таке запитання, і йому явно недостатньо (бо це клон, а не смітник). Дампи - це різні речі, як прості копії, наприклад: 1) вони не потрібні, щоб бути оптимальними (або навіть здатними) для нормальної роботи 2), але вони повинні мати хороший опір і можливість відновлення даних проти корупції даних 3) Це часто корисно якщо вони легко розрізнюються для додаткового резервного копіювання, тоді як копія не є ціллю.
петерх

0

Ось два варіанти:

  1. Ви можете безпосередньо взяти тар каталога git repo, оскільки він містить весь оголений вміст репо на сервері. Існує невелика ймовірність, що хтось може працювати над репо, під час здійснення резервного копіювання.

  2. Наступна команда дасть вам голий клон репо (так само, як це на сервері), тоді ви можете взяти тар місця, де ви клонували без жодних проблем.

    git clone --bare {your backup local repo} {new location where you want to clone}
    

Я думаю, що він добре знає команду клона або дьогтю, якщо він може задати таке питання, і йому явно недостатньо (бо це клон, а не смітник). Дампи - це різні речі, як прості копії, наприклад: 1) вони не потрібні, щоб бути оптимальними (або навіть здатними) для нормальної роботи 2), але вони повинні мати хороший опір і можливість відновлення даних проти корупції даних 3) Це часто корисно якщо їх легко розрізнити для додаткового резервного копіювання, тоді як це не є ціллю для копій.
петерх

3
peterh, Однозначно, він не просив команди смоли або клонування. Якщо ви придивитесь уважніше, я також не пояснював цих команд. Те, що я намагався пояснити, - це резервне копіювання Git за допомогою різного методу, який може включати різні команди Linux, що не означає, що я навчаю ці команди Linux. Я намагаюся вкласти сюди мало ідей.
vishal sahasrabuddhe

0

Якщо він знаходиться на Github, перейдіть до бітбукета та використовуйте метод "імпортувати сховище", щоб імпортувати своє github репо як приватне репо.

Якщо він знаходиться в бітбукеті, зробіть навпаки.

Це повна резервна копія, але залишається в хмарі, що є моїм ідеальним методом.


-7

Наскільки я знаю, ви можете просто зробити копію каталогу, в якому знаходиться ваше репо, це все!

cp -r project project-backup

Хто-небудь може підтвердити це? Я вважаю, що це правильний підхід для створення належного резервного копіювання.
Равіндранат Акіла

5
Я думаю, ви могли б отримати незрозумілий знімок, коли під час операції копіювання зміни вносяться / переносяться в сховище. Використання команд git, як-от git clone --bare, дасть вам послідовний знімок.
Еельке

1
Погоджено з Сунілом - це, здається, не атомне.
jia103

1
@ jia103 Це не завжди проблема, якщо вона не є атомною - потрібно лише знати і потрібно вміти, щоб гарантувати, що ніхто інший не зможе дійти до репо, поки ви працюєте над ним. Але я думаю, що ОП хоче специфічного інструменту для оптимізації git repos для виконання завдання, мабуть, йому відома проста копія файлів.
петерх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.