Git Clone: ​​Просто файли, будь ласка?


141

Я хочу клонувати репортаж GIT, а НЕ закінчувати .gitкаталог. Іншими словами, я просто хочу файли. Чи є спосіб це зробити?

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

Я намагаюся зробити це для віддаленого репо, а не локального, це означає, що це не дублікат " Як зробити" експорт git "(наприклад," SVN-експорт ") " (навіть якщо рішення може виявитися " те саме).



@Greg Hewgill Я намагаюся зробити це з віддаленого репо. Не впевнений, чи це робить це питання унікальним.
Dan Rosenstark

1
Хоча це нове питання, але я думаю , що це варто перевірити: stackoverflow.com/questions/11497457 / ...
eonil

1
Дивіться мою відповідь оновлення : git archiveзараз (Q4 2017) точніше і не буде включати порожні папки.
VonC

1
Будь ласка. Мабуть, ваш коментар позначено і видалено ... chat.stackoverflow.com/transcript/134259?m=39402889#39402889
VonC

Відповіді:


75

Команда 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

Папка repo включала б лише файл, без .git.

Примітка: git --git-dir це варіант командиgit , ні git clone.


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

" git archive", особливо при використанні з pathspec, зберігає порожній каталог у своєму виході, хоча сам Git ніколи цього не робить.
Це було виправлено.

Див. Комісію 4318094 (12 вересня 2017 р.) Від Рене Шарфе (``) .
Запропоновано: Джефф Кінг ( peff) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 62b1cb7 , 25 вересня 2017 р.)

archive: не додайте порожні каталоги до архівів

Хоча git не відслідковує порожні каталоги, git archiveїх можна вводити в архіви.
Хоча це підтримується об’єктною базою даних, воно не може бути представлене в індексі, і, отже, навряд чи це траплятиметься в дикій природі.

Оскільки порожні каталоги не підтримуються git, вони також не повинні записуватися в архіви.
Якщо порожній каталог дійсно потрібен, його можна відстежувати та архівувати, розміщуючи в ньому порожній .gitignoreфайл.


4
Це працювало для мене. Я б додав ще одну річ. Якщо ви зовсім не переймаєтесь папкою .git, то я скористався б цією командою:git --git-dir=/dev/null clone --depth=1 /url/to/repo
HumanSky

Це не видаляє папку
.git

@VonC Я спробував: git --git-dir = / dev / null clone --depth = 1 / url / to / repo
aliasav

1
Біг git archive --remote=https://github.com/pornel/dssim.git @ | tar -tя отримую tar: This does not look like a tar archive. Це не працює з GitHub? Також, що @означає?
Андре Верланг

2
@ AndréWerlang через 7 років ... Я не надто впевнений у цьому @: я його зняв. Також GitHub не підтримує віддалений git archive: я відредагував відповідь, щоб запропонувати альтернативу.
VonC


42

ви можете створити дрібний клон, щоб отримати лише останні кілька змін:

 git clone --depth 1 git://url

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


Як запобігти цій помилці, коли я її оновлюю, повторюючи клон: "fatal: шлях до призначення" XYZ "вже існує і не є порожнім каталогом."
Sohail Si

1
@SohailSi: або клонуйте до нового місця розташування, або видаліть старий каталог. Вам, мабуть, краще просто отримати нові редакції, якщо ви хочете оновити свою локальну копію.
knittl

3

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

Редагувати: Або насправді для чого взагалі використовувати клон? Це трохи заплутано, коли ти кажеш, що хочеш git repo, але без .gitкаталогу. Якщо ви маєте на увазі, що ви просто хочете копію якогось стану дерева, то чому б не зробити cp -Rв оболонці замість клона git, а потім видалити .gitзгодом.


Дякую за це. Файли знаходяться в git repo. Я сподівався мати можливість скеровувати користувачів Mac, щоб отримати копію репо в один рядок, не перетворившись на репортаж GIT.
Дан Розенстарк

У вас не повинно бути людей, які безпосередньо отримують код з репо, якщо вони не можуть його використовувати (тобто не мають сховища Git).
альтернатива

@Amoss Випускає тарбол, щоб люди не постійно хапали останній код?
альтернатива

1
@mathepic: і щоб випустити тарбол, вам потрібен спосіб отримання чистої робочої копії з сховища - саме це було поставлено питання.
Андрій

1
Прочитавши відповідь нижче, а потім трохи погуглившись, привело до іншого питання: stackoverflow.com/questions/160608/… Якщо ви подивитесь на використання архіву git --remote, то він робить саме те, що ви (та оригінальний плакат ) шукають. Правка: на що Джон відповів нижче.
Андрій

2

Це здається, що ви просто хочете копію вихідного коду. Якщо так, чому б не просто скопіювати каталог та виключити каталог .git з копії?


5
Це те, про що я запитую: як це зробити з git ... Я вже можу сказати, що немає вбудованого способу зробити це з тих відповідей, які я отримую. Все одно, дякую!
Dan Rosenstark

2

git checkout -f

Є ще один спосіб зробити це, відокремивши репо з робочого дерева.

Цей метод корисний, якщо вам потрібно регулярно оновлювати ці файли git без вмісту. Наприклад, я використовую його, коли мені потрібно перевірити вихідні файли та створити артефакт, після чого скопіюйте артефакт в інший репо-файл для розгортання на сервері, і я також використовую його, коли посилаю вихідний код на сервер, коли я хочу вихідний код для оформлення замовлення та вбудованого файлу в www.

Ми зробимо дві папки, одна для git, а для робочих файлів:

mkdir workingfiles
mkdir barerepo.git

ініціалізувати голий git repo:

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 repo, вам не доведеться турбуватися про команду, яка використовується для видалення git-файлів інших repo.


1
Домовились. Тут можливий поштовий гачок на голому репо. +1
VonC

багато роботи, якщо ви просто намагаєтеся отримати файли
Rainb

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