Git Клон: Просто файлы, пожалуйста?

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

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

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

Ответ 1

Команда 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 [email protected]: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 - это опция команды git, а не git clone.


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

" git archive ", особенно при использовании с pathspec, хранит пустой каталог в своих выходных данных, даже если сам Git этого не делает.
Это было исправлено.

См. Коммит 4318094 (12 сентября 2017 г.) Рене Шарфа ('').
Предложил: Джефф Кинг (peff).
(Объединено Junio C Hamano - gitster - в коммите 62b1cb7, 25 сентября 2017 г.)

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

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

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

Ответ 2

git archive --format=tar --remote=<repository URL> HEAD | tar xf -

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

Ответ 3

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

 git clone --depth 1 git://url

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Git Checkout -f

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

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

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

mkdir workingfiles
mkdir barerepo.git

инициализировать голое репозиторий git:

cd barerepo.git
git --bare init 

Затем создайте сообщение -r eceive hook:

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

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

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

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

git remote add myserver ssh://[email protected]:/path/to/barerepo.git

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

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

Ответ 7

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

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

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

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

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

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

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