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

145

Есть ли флаг, который нужно передать gitпри выполнении клонирования, скажем, не клонировать .gitкаталог? Если нет, то как насчет флага для удаления .gitкаталога после клона?

Джастин
источник
41
Этот вопрос не является обманом того, как сделать «экспорт git» (например, «svn export») . Данный вопрос о том , как клонировать а (удаленный) репозиторий без в .gitкаталоге. Предполагаемая двойка спрашивает, как экспортировать существующее хранилище, где у вас уже есть .gitкаталог.
mknaf
3
Согласен. Вы не можете git archiveудаленное хранилище, как говорит «возможное дублирование».
Владислав Раструсный

Ответы:

215

использование

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • Опция глубины позволит скопировать наименьшее количество истории, чтобы получить этот репо.
  • Опция ветвления является необязательной, и если она не указана, она получит master.
  • Вторая строка сделает ваш каталог больше dirformynewrepoне Git-репозиторием.
  • Если вы выполняете рекурсивное клонирование подмодулей, параметры глубины и ветвления не применяются к подмодулям.
Адам Димитрук
источник
19
что !$/.gitзначит?
Юрген Пауль
15
Для тех, кто заинтересован, это одно из обозначений слов , часть функции расширения истории в Bash и zsh.
Rufflewind
Есть ли способ получить глубину = 1 всех веток в репо? не просто мастер или указанная ветка
Gayan Pathirage
2
Вы делаете это с опцией --no-single-branch, так как --depth подразумевает --single-branch, вы можете отменить это с помощью --no-single-branch. (Взято со страницы руководства git clone)
Роберт Стоддард
8
Использование !$, хотя и технически правильное в этом случае, не помогает людям, которые не распознают синтаксис, понять ответ на реальный вопрос. Он также опирается на вторую команду, следующую непосредственно за первой и в той же оболочке. Если кто-то пропустит эти неявные требования, он может полностью удалить что-то еще. Поэтому я полагаю, что ваш ответ может быть улучшен путем явного указания имени dirformynewrepoв качестве аргумента rmкоманды, поскольку это сделает связь между обеими командами намного более четкой.
davidA
29

поскольку вам нужны только файлы, вам не нужно рассматривать их как git-репо.

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

и это работает только с локальным путем и удаленным путем ssh / rsync, оно может не работать, если удаленный сервер предоставляет только доступ git: // или https: //.

Хуан Тао
источник
что не примет во внимание .gitignore?
Джей Джей Роман
Это правильно, это просто копирование рабочего дерева. git checkout раньше делал это правильно, теперь больше не делает.
Сильвен
Итак, что вы делаете, если сервер предоставляет только git: // доступ?
Рейн
4

В качестве альтернативы, если у вас установлен Node.js , вы можете использовать следующую команду:

npx degit GIT_REPO

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

Degit - это инструмент, созданный Ричем Харрисом, создателем Svelte и Rollup, который он использует для быстрого создания нового проекта путем клонирования репозитория без сохранения папки git. Но его также можно использовать для клонирования любого репо ...

Эрик Вуллингс
источник
-1

Вы всегда можете сделать

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

источник
45
скачать все и удалить каталог позже? например, в Emacs 95% от 1 ГБ в .git. так что --depth = 1 - это решение здесь ясно.
RParadox
1
я все еще вижу папку .git, когда делаю глубину = 1
Арье Армон
@AryehArmon конечно ты это видишь. Использование --depth не препятствует созданию .git, оно просто делает его мелкой копией, а размер .git намного меньше. Но если вы там вообще не хотите, вам нужно удалить его потом.
zeycus