Чи можливо зробити розрядний замовлення без попереднього перевірки всього сховища?


171

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

git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD

Проблема з цією послідовністю команд полягає в тому, що оригінальний клон також робить замовлення. Якщо ви додаєте -n до вихідної команди клонування, команда read-tree призводить до наступної помилки:

помилка: Рідка каса не залишає запису на робочій директорії

Як можна зробити розріджений замовлення без попередньої перевірки всіх файлів?



Примітка: також git worktree add --no-checkoutбуде працювати (не тільки git clone --no-checkout) з git 2.9 (Just 2016). Дивіться мою відповідь нижче
— VonC

Спробувавши всі рішення тут, єдине, яке просто завантажує каталог (не натискаючи після цього!) Це це .
— LondonRob

Відповіді:


24

У 2020 році існує більш простий спосіб розібратися з розрідженою касою, не турбуючись про файли .git. Ось як я це зробив:

git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
# they are checked out immediately after this command, no need to run git pull

Зауважте, що для цього потрібна встановлена ​​версія git 2.25. Детальніше про це читайте тут: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/

ОНОВЛЕННЯ:

Вищевказана git cloneкоманда все ще буде клонувати репо з його повною історією, хоча без перевірки файлів. Якщо вам не потрібна повна історія, ви можете додати в команду параметр --depth , наприклад:

# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 1

1
Це правда, хороший момент. Отримано. Я пішов sparse-checkout --coneособливість в stackoverflow.com/a/59515426/6309
— VonC

Варто додати тут частковий клон ( --filter) до своєї відповіді.
— Дао

@ alexey-grinko, перша команда все-таки повинна була клонувати цілу репо-репо, навіть якщо вона не перевірила це ... Я шукав, щоб заощадити час не клонування всіх речей, які мені не потрібні .. .
— mropp

1
@mropp, я оновив відповідь, додавши --depthпараметр, який дозволяє нам зробити дрібний клон. Чи допоможе це? @Tao, не впевнений, як використовувати --filterв цьому випадку, я не пробував. Чи можете ви навести приклад чи опублікувати іншу відповідь на цю тему?
— Олексій Гринько

4
зауважте, що вона не працює так само у випуску 2,27 - я не знаю чому.
— Блейз

162

Зауважте, що ця відповідь завантажує повну копію даних із сховища. git remote add -fКоманда буде клонувати весь репозиторій. З чоловічої сторінкиgit-remote :

З -fопцією, git fetch <name>запускається відразу після налаштування віддаленої інформації.


Спробуйте це:

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add -f origin git://...
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master

Тепер ви побачите, що у вас є "обрізаний" кас із лише файлами з потоку / в межах_репо / до / бажаного_субдіру (і на цьому шляху).

Зауважте, що у командному рядку Windows ви не повинні цитувати шлях, тобто ви повинні змінити 6-ю команду на цю:

echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout

якщо ви цього не отримаєте, то ви отримаєте лапки у файлі з обмеженим замовленням, і це не спрацює


3
Я не можу використовувати команду "git checkout [гілка]] (також знайдена помилка: розріджена каса не залишає запису в робочій директорії). Я використовував "git pull origin master", і він працює належним чином.
— Натті

2
З версією git 1.7.2.5 на Linux я отримав такі результати: echo 'dir / *' перевіряє лише файли в dir /, але не в його підкаталогах; echo 'dir /' (без зірочки!) правильно перевіряє все дерево під dir /. HTH
— pavek

37
Це просто не працювало для мене - команда "git remote" призвела до перевірки всього репо - бам! - саме тоді; тож "git config ..." та специфікація цікавого під-режиму в наступних командах не мали ефекту. Чи вказана URL-адреса репо в команді "git remote" лише шлях до .git-файлу верхнього рівня? Або це повинен бути шлях до цікавого суб-режиму?
— Роб Кранфілл

10
ось спрощена версія (немає необхідності вручну створювати каталог, робити init та віддалене додавання, просто виконайте звичайний клон git + цикл оформлення замовлення з опцією --no-checkout, як згадував @onionjake): git clone - no-checkout <project> cd <project> echo <dir>> .git / info / sparse-checkout git checkout <branch>
— Грегор

22
git remote addЗавантаження команд все , тому що це те , що -fробить - говорить він негайно витягти, перш ніж ви визначили рідкісні варіанти перевірочних. Але пропустити чи переупорядкувати це не допоможе. Рідкі каси стосуються лише робочого дерева, а не сховища. Якщо ви хочете, щоб ваш сховище замість цього перейшов на дієту, тоді вам потрібно переглянути --depthабо --single-branchваріанти.
— Міраль

43

У клона Git є варіант ( --no-checkoutабо -n), який робить те, що ви хочете.

У своєму списку команд просто змініть:

git clone <path>

До цього:

git clone --no-checkout <path>

Потім ви можете використовувати рідкісні замовлення, як зазначено в запитанні.


7
так, він не робить замовлення, але все-таки отримує можливість завантажити всю історію репо
— Jason S

9
@JasonS питання стосувалося конкретного питання не робити касу. Якщо ви не хочете, то всю історію використовуйте --depth <depth>параметр на git clone. Це завантажить лише останні <depth>комісії з історії. В даний час немає можливості частково завантажити одну команду з git, хоча якщо ваш віддалений підтримує це, ви можете використовувати git archive --remoteдля завантаження часткових наборів файлів.
— onionjake

Тепер ви також можете "перевірити" комісію, не завантажуючи файлів за допомогою vfsforgit.org . Це може бути корисно, якщо хтось намагається перевірити лише невеликий підмножину одного комітету.
— onionjake

22

У мене був подібний випадок використання, за винятком того, що я хотів перевірити лише фіксацію тегу та обрізку каталогів. Використання --depth 1робить це дуже рідко і може дійсно прискорити роботу.

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add origin <url>  # Note: no -f option
echo "path/within_repo/to/subdir/" > .git/info/sparse-checkout
git fetch --depth 1 origin tag <tagname>
git checkout <tagname>

3
--depth 1 називається дрібним клоном, просто FYI.
— Марк Еллісон

1
Це допомогло! Дякую
— kp123

1
Дякую за це Зрозуміло це з цим, спробувавши багато інших способів запобігти завантаженню всього репо.
— J ... S

12

Я знайшов відповідь, яку я шукав у однокласнику, опублікованому раніше pavek (спасибі!), Тому я хотів дати повну відповідь в одній відповіді, яка працює на Linux (GIT 1.7.1):

1--> mkdir myrepo
2--> cd myrepo
3--> git init
4--> git config core.sparseCheckout true
5--> echo 'path/to/subdir/' > .git/info/sparse-checkout
6--> git remote add -f origin ssh://...
7--> git pull origin master

Я трохи змінив порядок команд, але це, мабуть, не вплинуло. Ключовим є наявність кінцевої косої риски "/" в кінці шляху на кроці 5.


3
ти впевнений, що це те, чого ти хочеш? -f означає отримання всіх даних, ви все одно отримуєте всю іншу інформацію, яку ви не хочете, і це повільно. (Це все ще "перевірка всього сховища")
— Шуман

1
Я спробував вище кроки в Windows, але запасна каса не працює в командному рядку, тому я спробував оболонку Git Bash, і вона працювала !! командний рядок здатний виконувати всі команди git, такі як push, pull і т. д., але якщо справа доходить до розрідженої каси, вона не вдається.
— користувач593029

Як робити лише файли підкаталогу. Я хочу лише отримати файли всередині певного підкаталога.
— Бабіш Шрестха

@BabishShrestha дивіться коментар onionjake на іншу відповідь FWIW: |
— rogerdpack

9

На жаль, ніщо з вищезгаданого не працювало для мене, тому я витратив дуже довго на пробування різної комбінації sparse-checkoutфайлів.

У моєму випадку я хотів пропустити папки з налаштуваннями IntelliJ IDEA.

Ось що я зробив:


Біжи git clone https://github.com/myaccount/myrepo.git --no-checkout

Біжи git config core.sparsecheckout true

Створено .git\info\sparse-checkoutіз наступним вмістом

!.idea/*
!.idea_modules/*
/*

Запустіть "git checkout -", щоб отримати всі файли.


Найважливішою справою було додавання /*після назви папки.

У мене git 1.9


3
Ні, він все ще завантажує все, усі коміти та всі файли, git 2.3.2
— Tyguy7,

6
Рідкі каси зачіпають лише робоче дерево. Вони не впливають на розмір сховища або на те, що отримується. Вам потрібні різні варіанти, якщо ви цього хочете.
— Міраль

Спробуйте Git Bash Shell наступного разу, якщо ви працюєте в Windows і використовуйте вищезазначені кроки від 'pbetkier', це добре працює
— user593029

6

Так, можлива завантаження папки замість завантаження всього сховища. Навіть будь-яке / останнє зобов’язання

Гарний спосіб це зробити

D:\Lab>git svn clone https://github.com/Qamar4P/LolAdapter.git/trunk/lol-adapter -r HEAD
  1. -r HEAD завантажить лише останню версію, ігнорує всю історію.

  2. Зверніть увагу на магістраль та / конкретну папку

Скопіюйте та змініть URL до та після /trunk/. Я сподіваюся, що це комусь допоможе. Насолоджуйтесь :)

Оновлено 26 вересня 2019 року


застосовується лише для тих, хто надходить із або використовує svn. Не підтримає цього.
— C Джонсон

@CJohnson, як бачите, я клоную папку git repo. Працює чудово
— Камар

1
Зауважте, що це не щось, що git пропонує поза коробкою, а це щось, що Git hub пропонує поруч із звичайними пропозиціями Git. Однак він прекрасно працює, коли ти можеш використовувати його. Дякую!
— Qix - МОНІКА ПОМИЛИЛА

1
З безлічі пропозицій щодо SO, ваше - найбільш стисле і чітке рішення.
— бортовий борт

4

git 2.9 (червень 2016 р.) узагальнить --no-checkoutопцію до git worktree add(команда, яка дозволяє працювати з кількома робочими деревами для одного репо )

Див. Комісію ef2a0ac (29 березня 2016) Рея Чжана ( OneRaynyDay) .
Допомогли: Ерік Саншайн ( sunshineco) та Хуніо С Хамано ( gitster) .
(Об'єднано Хуніо С Хамано - gitster- у комітці 0d8683c , 13 квітня 2016 р.)

Сторінка git worktreeman тепер включає:

--[no-]checkout:

За замовчуванням addперевірку <branch>, однак, --no-checkoutможна використовувати для придушення оформлення замовлення, щоб здійснити налаштування, наприклад налаштування рідкої каси .


4

Кроки щодо розрідженої каси лише для певної папки:

1) git clone --no-checkout  <project clone url>  
2) cd <project folder>
3) git config core.sparsecheckout true   [You must do this]
4) echo "<path you want to sparce>/*" > .git/info/sparse-checkout
    [You must enter /* at the end of the path such that it will take all contents of that folder]
5) git checkout <branch name> [Ex: master]

FYI, на першому (1) кроці вам не потрібно використовувати - no-checkout. Просто клонуйте все репо, а потім виконайте всі наведені нижче кроки 2-5 (згадані вище), ви отримаєте вихід, що хочете. Повідомте мене, якщо ви цього не отримали.
— SANDEEP MACHIRAJU

4

На підставі цієї відповіді по apenwarr і цей коментар по Miral я придумав таке рішення , яке врятувало мене майже 94% дискового простору при клонуванні в Linux мерзотник сховище локально в той час як тільки хоче один підкаталог Documentation:

$ cd linux
$ du -sh .git .
2.1G    .git
894M    .
$ du -sh 
2.9G    .
$ mkdir ../linux-sparse-test
$ cd ../linux-sparse-test
$ git init
Initialized empty Git repository in /…/linux-sparse-test/.git/
$ git config core.sparseCheckout true
$ git remote add origin ../linux
# Parameter "origin master" saves a tiny bit if there are other branches
$ git fetch --depth=1 origin master
remote: Enumerating objects: 65839, done.
remote: Counting objects: 100% (65839/65839), done.
remote: Compressing objects: 100% (61140/61140), done.
remote: Total 65839 (delta 6202), reused 22590 (delta 3703)
Receiving objects: 100% (65839/65839), 173.09 MiB | 10.05 MiB/s, done.
Resolving deltas: 100% (6202/6202), done.
From ../linux
 * branch              master     -> FETCH_HEAD
 * [new branch]        master     -> origin/master
$ echo "Documentation/hid/*" > .git/info/sparse-checkout
$ git checkout master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'
$ ls -l
total 4
drwxr-xr-x 3 abe abe 4096 May  3 14:12 Documentation/
$  du -sh .git .
181M    .git
100K    .
$  du -sh
182M    .

Так я знизився з 2,9 ГБ до 182 МБ, що вже тихо приємно.

Я хоч і не змусив це працювати git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test( натякнув тут ), оскільки тоді відсутні файли були додані як видалені файли до індексу. Тож якщо хтось знає еквівалент git clone --filter=blob:noneдля git fetch, ми можемо зберегти ще кілька мегабайт. (Читання сторінки man git-rev-listтакож натякає на те, що є щось на кшталт --filter=sparse:path=…, але я також не працював над цим.

(Усі спробували з git 2.20.1 від Debian Buster.)


1
Цікаві відгуки. Отримано. Я теж не знаю --filter=sparse:path=….
— VonC

3

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

Цікаво, що якщо ви оформили каталог, який не знаходиться у файлі розрідженої каси, це, мабуть, не має ніякого значення. Вони не відображаються у статусі git, а git read-tree -m -u HEAD не призводить до його видалення. git reset - твердий також не призводить до видалення каталогу. Хтось із досвідченим бажанням коментувати, що думає git щодо перевірених каталогів, але яких немає у файлі розрядних замовлень?


0

У моєму випадку я хочу пропустити Podsпапку під час клонування проекту. Я робив крок за кроком, як нижче, і це працює для мене. Сподіваюся, це допомагає.

mkdir my_folder
cd my_folder
git init
git remote add origin -f <URL>
git config core.sparseCheckout true 
echo '!Pods/*\n/*' > .git/info/sparse-checkout
git pull origin master

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

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