Клон Git без каталогу .git


144

Чи є прапор, на який потрібно пройти, gitроблячи клон, скажімо, не клонуйте .gitкаталог? Якщо ні, як щодо прапора для видалення .gitкаталогу після клонування?


41
Це питання не є принципом, як зробити "експорт git" (наприклад, "svn export") . Дане питання про те , як клонувати а (віддалений) репозиторій без в .gitкаталозі. Передбачуваний дуп запитує, як експортувати наявне сховище, куди у вас вже є .gitкаталог.
mknaf

3
Погодьтеся. Ви не можете git archiveвидалити сховище, як говорить рішення "можливий дублікат".
Владислав Раструсний

Відповіді:


214

Використовуйте

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • Параметр «Глибина» обов'язково скопіює найменший біт історії, щоб отримати це репо.
  • Параметр гілки необов’язковий і, якщо не вказано, отримає головний.
  • Другий рядок зробить ваш каталог вже dirformynewrepoне сховищем Git.
  • Якщо ви робите рекурсивний підмодульний клон, параметр глибини та гілки не застосовується до підмодулів.

19
що !$/.gitозначає?
Юрген Пол

15
Для тих, хто цікавиться, це одне із позначень слів , частина функції розширення історії в Bash та zsh.
Rufflewind

Чи є спосіб отримати глибину = 1 усіх гілок у репо? не просто господар або вказана гілка
Гаян Пафіраж

2
ви робите це з варіантом --no-single-branch, оскільки --depth припускає --sele-гілка, ви можете скасувати це з --no-single-branch. (Взято зі сторінки людини з клоном git-клонінгу)
Роберт Стоддард

8
Використання !$в цьому випадку технічно правильного нічого не допомагає людям, які не розпізнають синтаксис, зрозуміти відповідь на власне питання. Він також покладається на другу команду, безпосередньо слідуючи за першою, і в межах однієї оболонки. Якщо хтось відмовиться від цих неявних вимог, він може остаточно видалити щось інше. Тому я пропоную вашу відповідь можна покращити, чітко вказавши ім'я dirformynewrepoяк аргумент rmкоманди, оскільки це зробить зв'язок між обома командами набагато чіткішим.
davidA

29

оскільки ви хочете лише файли, вам не потрібно трактувати це як git repo.

rsync -rlp --exclude '.git' user@host:path/to/git/repo/ .

і це працює лише з локальним шляхом та віддаленим маршрутом ssh / rsync, воно може не працювати, якщо віддалений сервер надає лише git: // або https: // доступ.


що не враховуватиме .gitignore до уваги?
JJ Роман

itub правильно, це просто копіювання робочого дерева. git checkout раніше для цього правильно, тепер це більше не відбувається.
Sylvain

Отже, що робити, якщо сервер надає лише git: // доступ?
Дощ

3

Крім того, якщо у вас встановлений Node.js , ви можете використовувати таку команду:

npx degit GIT_REPO

npxпостачається разом із Node, і він дозволяє запускати пакети на основі двійкових вузлів, не встановлюючи їх спочатку (як альтернатива, спочатку ви можете встановити degitглобально, використовуючиnpm i -g degit ).

Degit - це інструмент, створений Річ Харріс, творець Svelte and Rollup, який він використовує для швидкого створення нового проекту шляхом клонування сховища, не зберігаючи папку git. Але він також може бути використаний для клонування будь-якого РЕПО одного разу ...


-1

Ви завжди можете це зробити

git clone git://repo.org/fossproject.git && rm -rf fossproject/.git

44
завантажити все та видалити реєстр пізніше? наприклад, у Emacs 95% 1 ГБ в .git. тому --depth = 1 - рішення тут чітко.
RParadox

1
я все ще бачу .git папку , коли я робити глибина = 1
Ар'є Армон

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