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
Очень просто ИМХО
- Просто
git clone REPO_URL
это тогда - Просто удалите
.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
Надеюсь, это поможет.