Git Clone: ​​Только файлы, пожалуйста? - PullRequest
122 голосов
/ 16 октября 2010

Я хочу клонировать репозиторий GIT и НЕ получить каталог .git. Другими словами, я просто хочу файлы. Есть ли способ сделать это?

git clone --no-checkout сделал прямо противоположное тому, что я хочу (дал мне только каталог .git).

Я пытаюсь сделать это для удаленного репо, а не локального. Это означает, что не является дубликатом из " Как выполнить« экспорт git » (например, «svn export»)"(хотя решение может оказаться таким же).

Ответы [ 7 ]

65 голосов
/ 16 октября 2010

Команда git, которая будет ближайшей к тому, что вы ищете, будет git archive.
См. проект резервного копирования, использующий git : он будет включать в архив все файлы (включая подмодули, если вы используете скрипт git-archive-all)

Затем вы можете использовать этот архив где угодно, возвращая вам только файлы, нет.git каталог.

git archive --remote=<repository URL> | tar -t

Если вам нужны папки и файлы только с первого уровня:

git archive --remote=<repository URL> | tar -t --exclude="*/*"

Чтобы вывести список только папок первого уровня удаленного репо:

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"

Примечание: не работает для GitHub (не поддерживается)

Так что вам потребуется для клонирования (мелкий для ускорения шага клонирования), а затемархивировать локально :

git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar

Другой вариант - сделать неглубокий клон (как указано ниже), но найти папку .git в другом месте.

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo

Папка репо будет содержать только файл, без .git.

Примечание: git --git-dir является опцией запятойnd git, а не git clone.


Обновление с помощью Git 2.14.X / 2.15 (четвертый квартал 2017 года): , избегайтедобавление пустых папок .

"git archive", особенно при использовании с pathspec, сохраняло пустой каталог в своих выходных данных, даже если сам Git никогда этого не делал.
Это былоисправленКороль (peff) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 62b1cb7 , 25 сентября 2017 г.)

archive: не добавлять пустые каталоги в архивы

Пока git не отслеживает пустые каталоги, git archive можно обмануть, поместив некоторые в архивы.
Хотя это поддерживается объектной базой данных, она не может быть представлена ​​в индексе и, следовательно, вряд ли это произойдет в дикой природе.

Поскольку пустые каталоги не поддерживаются git, они также не должныбыть написаннымв архив.
Если действительно нужен пустой каталог, его можно отследить и заархивировать, поместив в него пустой файл .gitignore.

57 голосов
/ 23 ноября 2012
git archive --format=tar --remote=<repository URL> HEAD | tar xf -

взято из здесь

40 голосов
/ 16 октября 2010

вы можете создать неглубокий клон, чтобы получить только последние несколько ревизий:

 git clone --depth 1 git://url

, затем либо просто удалите каталог .git, либо используйте git archive для экспорта своего дерева.

3 голосов
/ 16 октября 2010

Почему бы не выполнить клонирование, а затем удалить каталог .git, чтобы у вас была только рабочая копия?

Редактировать: Или вообще зачем вообще использовать клон? Это немного сбивает с толку, когда вы говорите, что хотите git-репо, но без каталога .git. Если вы имеете в виду, что вы просто хотите получить копию некоторого состояния дерева, то почему бы не сделать cp -R в оболочке вместо клона git и затем удалить .git.

2 голосов
/ 09 мая 2018

git checkout -f

Есть еще один способ сделать это, отделив репо от рабочего дерева.

Этот метод полезен, если вам необходимо регулярно обновлять эти git-файлы. Например, я использую его, когда мне нужно проверить исходные файлы и создать артефакт, затем скопировать артефакт в другое хранилище просто для развертывания на сервере, а также я использую его при передаче исходного кода на сервер, когда я хочу Исходный код для оформления заказа и встраивания в каталог www.

Мы сделаем две папки, одну для git, одну для рабочих файлов:

mkdir workingfiles
mkdir barerepo.git

инициализация голого репозитория git:

cd barerepo.git
git --bare init 

Затем создайте хук после получения:

touch hooks/post-receive
chmod ug+x hooks/post-receive

Редактировать пост-получение в вашем любимом редакторе:

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

Добавить это как удаленный:

git remote add myserver ssh://user@host:/path/to/barerepo.git

Теперь каждый раз, когда вы продвигаетесь к этому голому репо, оно проверяет рабочее дерево на /workingfiles/. Но /workingfiles/ сам не находится под контролем версий; запуск git status в /workingfiles/ выдаст ошибку fatal: Not a git repository (or any parent up to mount point /data). Это просто простые файлы.

В отличие от других решений, команда rm -r .git не нужна, поэтому, если /workingfiles/ - это какое-то другое git-репо, вам не нужно беспокоиться о команде, использованной для удаления файлов git другого репозитория.

2 голосов
/ 16 октября 2010

Звучит так, будто вы просто хотите получить копию исходного кода.Если так, то почему бы просто не скопировать каталог и исключить каталог .git из копии?

0 голосов
/ 23 июня 2019

Очень просто ИМХО:

  1. Просто git clone REPO_URL тогда
  2. Просто удалите .git dir, используя rm -rf ./REPO_NAME/.git из репо.

Например, если имя моего репозитория MyRepo, чтобы получить этот репозиторий без метаданных, я мог бы выполнить либо:

git clone https://github.com/MyUser/MyRepo.git && rm -rf ./MyRepo/.git

Или я могу получить его в указанном каталоге (скажем, в каталоге с именем MyDir):

git clone https://github.com/MyUser/MyRepo.git MyDir && rm -rf ./MyDir/.git

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...