Вопрос: Сделайте «git export» (например, «svn export»)?


Мне было интересно, есть ли хорошее решение «git export», которое создает копию дерева без .gitкаталог репозитория. Есть, по крайней мере, три метода, о которых я знаю:

  1. git cloneс последующим удалением .gitкаталог репозитория.
  2. git checkout-indexссылается на эту функциональность, но начинается с «Просто прочитайте нужное дерево в индекс ...», которое я не совсем уверен, как это сделать.
  3. git-exportявляется сторонним скриптом, который, по существу, выполняет git cloneво временное место, за которым следует rsync --exclude='.git'в конечный пункт назначения.

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


2158


источник


Ответы:


Вероятно, самым простым способом добиться этого является git archive, Если вам действительно нужно только расширенное дерево, вы можете сделать что-то подобное.

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

В большинстве случаев, когда мне нужно «экспортировать» что-то из git, я хочу, чтобы в любом случае был сжатый архив, поэтому я делаю что-то вроде этого.

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

Почтовый архив:

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

git help archiveдля более подробной информации, это довольно гибко.


Имейте в виду, что, несмотря на то, что архив не будет содержать каталог .git, он, однако, будет содержать другие скрытые git-определенные файлы, такие как .gitignore, .gitattributes и т. Д. Если вы не хотите их в архиве, убедитесь, что вы используйте атрибут export-ignore в файле .gitattributes и зафиксируйте это, прежде чем делать свой архив. Прочитайте больше...


Примечание. Если вы хотите экспортировать индекс, команда

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

(Видеть Ответ Грега Больше подробностей)


2187



Я узнал, что означает вариант 2. Из репозитория вы можете:

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

Слэш в конце пути важен, иначе это приведет к тому, что файлы находятся в / destination с префиксом «путь».

Поскольку в нормальной ситуации индекс содержит содержимое репозитория, нет ничего особенного в том, чтобы «читать нужное дерево в индекс». Это уже есть.

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

Кажется, это своего рода «git export», который я искал.


301



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



enter image description here

Ответ на специальный случай, если хранилище размещено в GitHub.

Просто используйте svn export,

Насколько я знаю, Гитуб не позволяет archive --remote, Хотя GitHub - это Совместимость с SVN и у них есть все репозитории git 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

Пример с Библиотека JavaScript jQuery

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

46



Из Руководство Git :

Использование git-checkout-index для «экспорта всего дерева»

Префиксная способность в основном делает тривиальным использование git-checkout-index в качестве функции «экспорт как дерево». Просто прочитайте нужное дерево в индексе и выполните:

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


38



Я написал простую обертку вокруг git-checkout-indexчто вы можете использовать вот так:

git export ~/the/destination/dir

Если каталог назначения уже существует, вам нужно добавить -fили --force,

Установка проста; просто отпустите скрипт где-нибудь в своем PATH, и убедитесь, что он выполним.

Репозиторий github для git-export


37



It appears that this is less of an issue with Git than SVN. Git only puts a .git folder in the repository root, whereas SVN puts a .svn folder in every subdirectory. So "svn export" avoids recursive command-line magic, whereas with Git recursion is not necessary.


35



The equivalent of

svn export . otherpath

inside an existing repo is

git archive branchname | (cd otherpath; tar x)

The equivalent of

svn export url otherpath

is

git archive --remote=url branchname | (cd otherpath; tar x)

26



I use git-submodules extensively. This one works for me:

rsync -a ./FROM/ ./TO --exclude='.*'

20



If you're not excluding files with .gitattributes export-ignore then try git checkout

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-f
When checking out paths from the index, do not fail upon unmerged entries; instead, unmerged entries are ignored.

and

-q
Avoid verbose

Additionally you can get any Branch or Tag or from a specific Commit Revision like in SVN just adding the SHA1 (SHA1 in Git is the equivalent to the Revision Number in SVN)

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

The /path/to/checkout/ must be empty, Git will not delete any file, but will overwrite files with the same name without any warning

UPDATE: To avoid the beheaded problem or to leave intact the working repository when using checkout for export with tags, branches or SHA1, you need to add -- ./ at the end

The double dash -- tells git that everything after the dashes are paths or files, and also in this case tells git checkout to not change the HEAD

Examples:

This command will get just the libs directory and also the readme.txt file from that exactly commit

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

This will create(overwrite) my_file_2_behind_HEAD.txt two commits behind the head HEAD^2

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

To get the export of another branch

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

Notice that ./ is relative to the root of the repository


20



This will copy all contents, minus the .dot files. I use this to export git cloned projects into my web app's git repo without the .git stuff.

cp -R ./path-to-git-repo /path/to/destination/

Plain old bash works just great :)


16