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


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.