Питання Виконати експорт "git" (наприклад, "svn export")?


Мені було цікаво, чи існує хороше рішення для "експорту git", яке створює копію дерева без .git каталог репозиторіїв. Є щонайменше три методи, які я знаю:

  1. git clone потім видаляють .git каталог репозиторіїв.
  2. git checkout-index називає цю функцію, але починається з "Просто прочитайте потрібне дерево в індекс ...", який я не зовсім впевнений, як це зробити.
  3. git-export це сторонний скрипт, який по суті робить a git clone в тимчасове місце, за яким слідує rsync --exclude='.git' в кінцевий пункт призначення.

Жоден з цих рішень дійсно не вражає мене задовільним. Найближчий до svn export може бути варіантом 1, тому що обидва вимагають, щоб цільова директорія була першою. Але варіант 2 виглядає ще краще, якщо спробувати зрозуміти, що означає читати дерево в індекс.


2165
2017-10-02 02:21


походження


@rnrTom: Див. відповідь Сомова. (у tar архіву немає нічого "стисненого"). - etarion
@mrTom git archive --format zip --output "output.zip" master -0 дасть вам нескомпресований архів (-0 - прапорець для незжатого). git-scm.com/docs/git-archive.
Я погоджуюсь з @mrTom, і я не думаю, чи є архів стиснутим чи не стиснутим - це головна проблема. З SVN можу export підкаталог 250 Кбайт безпосередньо з віддаленого сховища (який в іншому випадку може бути розміром 200 МБ, за винятком редагування), і я потрапляю в мережу лише за 250 КБ (або так) передачі завантаження. З git, archive повинен бути включений на сервері (тому я не можу спробувати) - clone --depth 1 від сервера може все-таки отримати repo сказати 25 МБ, де .git Тільки підпапку займає 15 Мб. Тому я все ще казав відповідь "ні". - sdaau
@mrTom відповідь насправді ТАК Подивіться відповідь OP - команда git checkout-index - nocache
Ось хороший і простий спосіб: git archive -o latest.zip HEAD - Evgeni Sergeev


Відповіді:


Ймовірно, найпростіший спосіб досягти цього - це git archive. Якщо вам дійсно потрібно лише розгорнутий дерево, ви можете зробити щось подібне.

git archive master | tar -x -C /somewhere/else

У більшості випадків, коли мені потрібно експортувати щось з git, я хочу у будь-якому випадку стиснутий архів, щоб я зробив щось подібне.

git archive master | bzip2 >source-tree.tar.bz2

ZIP архів:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive Для більш детальної інформації, це досить гнучко.


Майте на увазі, що хоча в архіві не міститься каталог .git, він також містить інші приховані файли типу git, такі як .gitignore, .gitattributes тощо. Якщо ви не бажаєте їх у архіві, переконайтеся, що ви використовуйте атрибут ignore-експорту в файлі .gitattributes і внесіть його перед виконанням вашого архіву. Читати далі ...


Примітка. Якщо ви зацікавлені в експорті індексу, команда є

git checkout-index -a -f --prefix=/destination/path/

(Побачити Грега відповідає для більш детальної інформації)


2198
2017-10-02 18:13



ZIP архів: git archive --format zip --output /full/path master - Stream
Майте на увазі, що в архіві не міститься каталог .git, але буде містити інші приховані файли типу git, такі як .gitignore, .gitattributes тощо. Отже, якщо ви не бажаєте їх, переконайтеся, що ви використовуєте атрибут export-ignore .gitattributes файл і здійснити це, перш ніж робити ваш архів. Побачити feeding.cloud.geek.nz/2010/02/... - mj1531
Щоб прослідкувати за приміткою "Потоки", ви можете додати рядок "--prefix = something /" до команди, щоб керувати ім'ям каталогу, який буде упакований у zip-файл. Наприклад, якщо ви використовуєте git archive --format zip --output /path/to/file.zip --prefix=newdir/ master висновок буде називатися 'file.zip', але при розпакуванні його, каталог верхнього рівня буде 'newdir'. (Якщо ви пропустите атрибут prepref, верхній рівень dir буде "файл"). - Alan W. Smith
Найпростіший спосіб: git archive -o latest.zip HEADВін створює архів Zip, який містить вміст останньої фіксації у поточній гілці. Зауважте, що вихідний формат визначається розширенням вихідного файлу. - nacho4d
Він не підтримує гіт підмодулі :( - umpirsky


Я дізнався, що означає варіант 2. З репозиторію ви можете зробити:

git checkout-index -a -f --prefix=/destination/path/

Важлива коса риска в кінці шляху, інакше це призведе до того, що файли в / призначення з префіксом "шляху".

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

The -a прапор повинен перевірити всі файли в індексі (я не знаю, що це означає, щоб пропустити цей прапор в цій ситуації, оскільки він не робить те, що хочу). The -f прапор перезаписує будь-які існуючі файли на виході, які ця команда зазвичай не робить.

Це, здається, є своєрідним "експортом", який я шукав.


301
2017-10-02 03:03



... і не ЗАБІГАЙТЕ СЛАШУ НА КОНЕЦ, або у вас не буде бажаного ефекту;) - conny
The git add команда змінює вміст у індексі, так що будь-що git status шоу як "бути вчинене" - це відмінності між HEAD та вмістом індексу. - Greg Hewgill
@conny: прочитайте ваш коментар, забув про це і запустив команду без кінцевої косу риси. порада: слідкуйте за порадою Конді -.- - Znarkus
+1, щоб порадити ближче. Також не намагайтеся створити "~ / dest /", оскільки це створює каталог у вашому робочому каталозі "~", а не те, що ви дійсно хотіли. Вгадайте, що відбувається, коли ви безглуздо набираєте rm -rf ~ - Kyle Heironimus
@KyleHeironimus - ваше попередження про використання '~ / dest /' правильне, якщо ви використовуєте лапки навколо вашого шляху префікса, який говорить, що оболонка не виконує розширення тильди. Директор закликав ~ (ні '~' !) буде створено у вашому робочому режимі. Тут немає нічого особливого git checkout-index в цьому відношенні: те саме стосується і mkdir '~/dest' (не робіть цього!) Ще одна вагома причина, щоб уникнути імен файлів, які потребують котирування (наприклад, у них є пробіли) :-) - Matt Wallis


git archive також працює з віддаленим сховищем.

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

Щоб експортувати певний шлях всередину репо, додайте стільки шляхів, скільки хочете, як останній аргумент git, наприклад:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

241
2017-12-09 18:59



Цей варіант мені найбільше подобається. Це має додаткову перевагу, що він також працює на відкритих сховищах. - innaM
Удосконалюється версія: git archive --format=tar --prefix=PROJECT_NAME/ --remote=USER@SERVER:PROJECT_NAME.git master | tar -xf -  (забезпечує, що ваш архів знаходиться в папці) - Nick
Примітка: сервер повинен активувати цю функцію. - Jakub Narębski
Я намагався : git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git master І стався смертельним: операція не підтримується протоколом. Неочікуваний кінець командного потоку. - andyf
@andyf GitHub має свій спосіб: curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf - за документи - bishop


enter image description here

Спеціальний варіант відповіді, якщо репозиторій розміщений на GitHub.

Просто використовуй svn export.

Наскільки я знаю, Гітуб не дозволяє archive --remote. Хоча GitHub є svn сумісний і у них є всі гіт репо svn доступний, щоб ви могли просто скористатись svn export як звичайно, з деякими коригуваннями вашого URL-адреси GitHub.

Наприклад, щоб експортувати весь сховище, зверніть увагу, як це зробити trunkв URL замінюється master (або будь-який інший HEAD гілка проекту встановлена ​​на):

svn export https://github.com/username/repo-name/trunk/

І ви можете експортувати один файл або навіть певний шлях або папку:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

Приклад з jQuery JavaScript Library

The HEAD філія або магістр галузь буде доступна за допомогою trunk:

svn ls https://github.com/jquery/jquery/trunk

НеофіційнийHEAD  філії буде доступний під /branches/:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

Все мітки під /tags/ так само:

svn ls https://github.com/jquery/jquery/tags/2.1.3

48
2017-10-30 17:03



git archive добре працює з GitHub, якщо ви використовуєте протокол git, просто замініть https:// з git:// в URL-адресі Я не знаю, чому GitHub не рекламує цю приховану функцію. - Neil Mayhew
@NeilMayhew Це не працює для мене, я отримую fatal: The remote end hung up unexpectedly. Спроба на двох різних серверах з jQuery github repo. - Anthony Hatzopoulos
Ти маєш рацію. Я забув, що я використовую git config url.<base>.insteadOf для кешування віддаленого сховища. Тому я використовував file:// URL насправді. Я сумніваюся в цьому git archive міг би працювати з git:// URL-адреси, оскільки він повинен мати можливість запускати git-upload-archive на віддаленому кінці. Це повинно бути можливо з використанням ssh протокол, за винятком того, що github це не дозволяє (Invalid command: 'git-upload-archive') - Neil Mayhew
Будь-який спосіб використовувати локальний серверний інструмент, що веде себе як github, якщо я хочу це робити на власних сховищах git? - kriss
виправданий - це зовсім химерно, що у Gіt ця функція не існує, і ми повинні вдатися до svn - Jason S


Від Посібник Git:

Використання git-checkout-index для "експортування всього дерева"

Потужність префіксу в принципі робить тривіальним використання git-checkout-index як функції "експортувати як дерево". Просто прочитайте потрібне дерево в індекс і виконайте:

$ git checkout-index --prefix=git-export-dir/ -a


38
2017-10-02 02:27



Я думаю, що плутанина є фраза "читати потрібне дерево в індекс". - davetron5000
Якщо ви хочете експортувати директорію foo у гілку, то це буде git read-tree bar:foo І потім git checkout-index --prefix=export_dir/ -a після цього може бути, ви повинні зробити git update-index master - Pascal Rosin
Я не знаю, чому це не прийнята відповідь. - John Weldon
@ Джон-Велдон Чи потрібна вам спочатку клонування репо? Якщо це так, то я не погодився б на це, оскільки весь пункт "svn експорту" підкаталогу полягає в тому, щоб отримати безпосередньо копію цього підкаталогу; якщо хтось має 1GB Git repo, і все, що я хочу, - це 10kB підкаталогу, боже, вимагати від мене клонування всього цього. - Jason S
Також я echo @ davetron5000 з коментарем "читати потрібне дерево в індекс", який я не знаю, що це означає. - Jason S


Я написав просту обгортку навколо git-checkout-index що ви можете використовувати так:

git export ~/the/destination/dir

Якщо каталог призначення вже існує, вам потрібно буде додати -f або --force.

Встановлення просте; просто скиньте скрипт десь у своєму PATH, і переконайтеся, що він виконуваний.

Github сховище для git-export 


37
2017-10-16 17:17



Ця обгортка не є платформою-агностиком; він спирається на / bin / sh. Отже, якщо ви використовуєте Windows, це рішення ймовірно не буде працювати для вас. - shovavnik
Ось цей скрипт - це 57 рядків документації, пробілів, налаштування, розбору аргументів і лише одна рядок, яка насправді робить щось ... - Vladimir Panteleev


Здається, це менше проблеми з Git, ніж SVN. Git лише встановлює папку .git в кореневій сховищі, тоді як SVN поміщає папку .svn у кожному підкаталозі. Таким чином, "svn exportion" уникає рекурсивної командної магії, тоді як з Git рекурсія не потрібна.


35
2018-05-12 04:20



Як і SVN 1.7, існує лише одна папка .svn: subversion.apache.org/docs/release-notes/1.7.html#single-db - kostmo
Це не позбудеться будь-яких додаткових файлів збирання, які вилучають svn експорт. Тож це, безумовно, не відповідь. - ygoe
Введено вниз, оскільки відповідь недійсний. - bahrep