Частковий клон з Git та Mercurial


74

Чи можна клонувати лише одну гілку (або з даного коміту) в Git та Mercurial? Я маю на увазі, що я хочу клонувати центральне репо, але оскільки воно величезне, я хотів би отримати лише його частину і все одно мати можливість повернути свої зміни. Це можливо? Мовляв, я хочу лише від Tag 130 і далі чи щось подібне?

Якщо так, то як?


1
Дивіться також Git 2,17 частковий клон (або «вузький клон») stackoverflow.com/a/48852630/6309
VonC

Відповіді:


76

У Git land ви говорите про три різні типи часткових клонів:

  • дрібні клони: я хочу історію від точки перегляду X і далі.

    Використовуйтеgit clone --depth <n> <url> для цього, але пам’ятайте, що дрібні клони дещо обмежені у взаємодії з іншими сховищами. Ви зможете генерувати виправлення та надсилати їх електронною поштою.

  • частковий клон шляхом шляху: Я хочу всю історію історії редагувань у якомусь каталозі/path.

    Неможливо в Git. З сучасним Git, хоча ви можете мати рідкісний замовлення , тобто у вас є ціла історія, але ви перевіряєте (маєте в робочій області) лише підмножину всіх файлів.

  • клонування лише вибраної гілки: я хочу клонувати лише одну гілку (або вибрану підмножину гілок).

    Можливо, і

    Перед мерзотник 1.7.10 не просто: вам потрібно буде робити те , що клон робить вручну, тобто git init [<directory>], то git remote add origin <url>, редагувати .git/configзамінюючи *в remote.origin.fetchпо запитаної гілки (ймовірно , «майстер»), потім git fetch.

    станом на git 1.7.10 git clone пропонує --single-branchопцію, яка, здається, була додана саме з цією метою, і здається досить простою.

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

Ви також можете зробити неглибокий клон лише вибраної підмножини гілок.

Якщо ви знаєте, як люди хочуть розбивати речі за шляхами файлів (кілька проектів в одному сховищі), ви можете використовувати підмодулі (на зразок svn: externals), щоб попередньо розділити репо на окремо клоновані частини.


Отже, якщо я клоную гілку "XX", вона отримає всі батьківські коміти від "master", так? Або лише один коміт, який я зробив на цій гілці?
Пабло

1
Якщо ви клонуєте (отримуєте) лише гілку "XX", ви отримаєте всі її коміти, включаючи ті коміти, які гілка "XX" має спільне з гілкою "master". У Git коміти не " належать " до гілки.
Якуб Нарембський,

Гаразд, тоді це все-таки не частковий клон, оскільки ви отримуєте всіх батьків і, отже, цілі репозиторії (гаразд, найбільша частина на
майстрі

1
У версії 1.8.0 (або трохи раніше) зробити клон з однією гілкою зараз набагато простіше.
Якуб Нарембський

1
Ви можете додати до цього списку «частковий клон» (або «вузький клон») з Git 2,17 (Q2 2018): stackoverflow.com/a/48852630/6309
VonC

51

У ртутній землі ви говорите про три різні типи часткових клонів:

  • дрібні клони: я хочу, щоб історія від версії X редагування використовувала віддалене розширення журналу
  • часткові клони за файловим шляхом: Я хочу, щоб вся історія версій у каталозі / шляху з експериментальним розширенням вузького рівня або я хочу, щоб у моєму робочому каталозі з експериментальним розрідженим розширенням були лише файли в каталозі / шляху (поставляється з версії 4.3, див. hg help sparse).
  • часткові клони за гілками: я хочу всю історію редагувань у гілці Y: використовувати clone -r

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

Крім того, щодо "такого величезного, що я хотів би отримати лише його частину": Ви дійсно повинні робити це лише один раз. Просто клонуйте його, поки ви обідаєте, і тоді у вас це буде назавжди більше. Згодом ви зможете pullефективно отримувати дельти вперед. А якщо ви хочете ще один його клон, просто клонуйте свій перший клон. Де ви взяли клон, не має значення (і місцеві клони не займають додаткового дискового простору, оскільки вони є жорсткими посиланнями під ковдрами).


1
також теги не те саме, що гілки, на відміну від деяких VCS, тому це підпадає під перший пункт
jk.

Існують плагіни історії обрізки ( mercurial.selenic.com/wiki/TrimmingHistory ) та неглибокий клон ( mercurial.selenic.com/wiki/ShallowClone ) для ртутного. Але я не знаю, наскільки вони хороші.
panzi

8
Обидва вони відхиляють пропозиції без реалізації.
Ry4an Brase,

4
* Дрібні клони тепер можна з допомогою «» remotefilelog: bitbucket.org/facebook/remotefilelog * Часткові клони по FilePath можливі (але все ще експериментальні), см comments.gmane.org/gmane.comp.version-control.mercurial.devel/ ...
Mathiasdm

1
В початку 2017 року: часткові клони по FilePath ( так званий вузький клон) до сих пір не в магістральному Mercurial , але можливо з розширенням від Google - bitbucket.org/Google/narrowhg . Так само розріджена оплата (вона ж вузька) не входить до основної лінії Mercurial, але можлива за допомогою sparse.pyрозширення Mercurial від Facebook - bitbucket.org/facebook/hg-experimental .
Анон,

9

Обрана відповідь дає хороший огляд, але не має повного прикладу.

Зведіть до мінімуму розмір завантаження та перевірки (а) , (б) :

git clone --no-checkout --depth 1 --single-branch --branch (name) (repo) (folder)
cd (folder)
git config core.sparseCheckout true
echo "target/path/1" >>.git/info/sparse-checkout
echo "target/path/2" >>.git/info/sparse-checkout
git checkout

Періодично оптимізуйте розмір місцевого сховища (c) (необов’язково, використовуйте обережно):

git clean --dry-run # consider and tweak results then switch to --force
git gc
git repack -Ad
git prune

Дивіться також: Як обробляти великі сховища за допомогою git


5

Цей метод створює неверсійний архів без підрепозиторіїв:

hg clone -U ssh://machine//directory/path/to/repo/project projecttemp

cd projecttemp

hg archive -r tip ../project-no-subrepos

Неверсійний вихідний код без підпозицій знаходиться в каталозі project-no-subrepos


2

Що стосується Git, може мати історичне значення те, що Лінус Торвальдс відповів на це питання з концептуальної точки зору ще в 2007 році в доповіді, яка була записана та доступна в Інтернеті.

Питання в тому, чи можна перевірити лише деякі файли зі сховища Git.

Технічна бесіда: Лінус Торвальдс на git t = 43: 10

Підводячи підсумок, він сказав, що одним із дизайнерських рішень Git, який відрізняє його від інших систем управління джерелами (він цитує BitKeeper та SVN), є те, що Git керує вмістом, а не файлами. Наслідки полягають у тому, що, наприклад, різниця підмножини файлів у двох версіях обчислюється шляхом спочатку взяття всієї різниці, а потім обрізання її лише до запитаних файлів. Інший - ви повинні перевірити всю історію; все або нічого. З цієї причини він пропонує розділити вільно пов'язані компоненти між кількома сховищами і згадує про постійні зусилля, спрямовані на впровадження користувальницького інтерфейсу для управління сховищем, яке структуровано як суперпроект, що містить менші сховища.

Наскільки мені відомо це фундаментальне дизайнерське рішення і сьогодні залишається яблуком. Суперпроект, мабуть, став тим, що зараз є підмодулями .


1
Я знаю пост ... Я спочатку подав його на slashdot: P
pablo

-1

У ртутному, ви могли б зробити це з цього, використовуючи:

hg convert --banchmap FILE SOURCEDEST REVMAP

Ви також можете захотіти:

--config convert.hg.startrev=REV

Джерелом може бути git, ртутний або безліч інших систем.

Я не пробував, але конвертувати досить багато.


4
Розширення Convert переписує хеші, отже це не частковий клон існуючого репо, а скоріше новий. Це означає, що це буде окреме сховище, яке не може витягнути або відсунути від вихідного.
Priit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.