Мне было интересно, есть ли хорошее решение "git export", которое создает копию дерева без .git
каталога репозитория. Есть как минимум три метода, о которых я знаю:
git clone
с последующим удалением.git
каталога репозитория.git checkout-index
ссылается на эту функциональность, но начинается с «Просто прочитайте нужное дерево в индекс ...», что я не совсем уверен, как это сделать.git-export
является сторонним скриптом, который, по сути, выполняетgit clone
временное расположение, а затемrsync --exclude='.git'
конечный пункт назначения.
Ни одно из этих решений не кажется мне удовлетворительным. Наиболее близким svn export
может быть вариант 1, потому что оба требуют, чтобы целевой каталог был пустым в первую очередь. Но вариант 2 кажется еще лучше, если предположить, что я могу понять, что значит читать дерево в индексе.
git
export
git-archive
svn-export
Грег Хьюгилл
источник
источник
git archive --format zip --output "output.zip" master -0
выдаст вам несжатый архив (-0 - флаг для несжатого). git-scm.com/docs/git-archive .export
получить подкаталог объемом 250 КБ непосредственно из удаленного репозитория (который в противном случае мог бы иметь размер 200 МБ без учета ревизий) - и я подключусь к сети только для передачи загрузки 250 КБ (или около того). Сgit
,archive
должен быть включен на сервере (поэтому я не могу попробовать) -clone --depth 1
с сервера все еще можно получить репозиторий, скажем, 25 МБ, где.git
одна подпапка занимает 15 МБ . Поэтому я бы все равно сказал «нет».git checkout-index
git archive -o latest.zip HEAD
Ответы:
Вероятно, самый простой способ достичь этого с
git archive
. Если вам действительно нужно только расширенное дерево, вы можете сделать что-то вроде этого.В большинстве случаев мне нужно «экспортировать» что-то из git, в любом случае мне нужен сжатый архив, поэтому я делаю что-то подобное.
ZIP архив:
git help archive
для более подробной информации, это довольно гибкий.Имейте в виду, что, хотя архив не будет содержать каталог .git, он, однако, будет содержать другие скрытые специфичные для git файлы, такие как .gitignore, .gitattributes и т. Д. Если вы не хотите, чтобы они были в архиве, убедитесь, что вы используйте атрибут export-ignore в файле .gitattributes и передайте его перед созданием архива. Читать далее...
Примечание. Если вы заинтересованы в экспорте индекса, введите команду
(См . Ответ Грега для более подробной информации)
источник
git archive --format zip --output /full/path master
git archive --format zip --output /path/to/file.zip --prefix=newdir/ master
вывод, он будет называться «file.zip», но когда вы распакуете его, каталог верхнего уровня будет «newdir». (Если вы пропустите атрибут --prefix, каталог верхнего уровня будет «file».)git archive -o latest.zip HEAD
создать Zip-архив, содержащий содержимое последнего коммита в текущей ветке. Обратите внимание, что выходной формат определяется расширением выходного файла.Я узнал, что означает вариант 2. Из репозитория вы можете сделать:
Косая черта в конце пути важна, иначе это приведет к тому, что файлы будут в / destination с префиксом «путь».
Поскольку в обычной ситуации индекс содержит содержимое репозитория, ничего особенного для «чтения нужного дерева в индекс» делать нечего. Это уже там.
-a
Флаг требуется , чтобы проверить все файлы в индексе (я не уверен , что это значит пропустить этот флаг в этой ситуации, так как он не делает то , что я хочу).-f
флаг силы перезаписи существующих файлов на выходе, что эта команда обычно не делают.Похоже, это был тот «экспорт мерзавцев», который я искал.
источник
git add
изменяет содержимое в индексе, поэтому все, чтоgit status
отображается как «подлежащий фиксации», является разницей между HEAD и содержимым индекса.~
(не'~'
!). В этом нет ничего особенногоgit checkout-index
: то же самое относится и кmkdir '~/dest'
( не делай этого! ). Еще одна веская причина избегать имен файлов, которые должны заключаться в кавычки (например, с пробелом в них) :-)git archive
также работает с удаленным хранилищем.Чтобы экспортировать определенный путь внутри репозитория, добавьте столько путей, сколько вы пожелаете, в качестве последнего аргумента для git, например:
источник
git archive --format=tar --prefix=PROJECT_NAME/ --remote=USER@SERVER:PROJECT_NAME.git master | tar -xf -
(гарантирует, что ваш архив находится в папке)git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git master
и получил смертельный исход: операция не поддерживается протоколом. Неожиданный конец потока команд.curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -
по документамОтвет в особом случае, если хранилище размещено на GitHub.
Просто используйте
svn export
.Насколько я знаю, Github не позволяет
archive --remote
. Хотя GitHub совместим с SVN, и у них есть все репозитории git,svn
так что вы можете просто использоватьsvn export
как обычно, с некоторыми изменениями в вашем URL GitHub.Например, чтобы экспортировать весь репозиторий, обратите внимание на то, как
trunk
в URL-адресе заменяетсяmaster
(или на то, что указано в ветке HEAD проекта ):И вы можете экспортировать один файл или даже определенный путь или папку:
Пример с библиотекой jQuery JavaScript
HEAD
Филиал или мастер филиал будет доступен поtrunk
:Номера
HEAD
филиалов будут доступны в разделе/branches/
:Все теги под
/tags/
таким же образом:источник
git archive
работает отлично с GitHub, до тех пор , пока вы используете протокол GIT, Просто заменитеhttps://
сgit://
в URL. Я не знаю, почему GitHub не рекламирует эту скрытую функцию.fatal: The remote end hung up unexpectedly
. Пробовал на двух разных серверах с jQuery github repo.git config url.<base>.insteadOf
для кэширования удаленного хранилища. Поэтому я использовалfile://
URL в реальности. Я сомневаюсь, что этоgit archive
может работать сgit://
URL-адресами, так как он должен быть в состоянии работатьgit-upload-archive
на удаленном конце. Это должно быть возможно при использованииssh
протокола, за исключением того, что github не разрешает это (Invalid command: 'git-upload-archive'
).Из руководства Git :
Использование git-checkout-index для «экспорта всего дерева»
Возможность префикса в основном упрощает использование git-checkout-index в качестве функции «экспортировать как дерево». Просто прочитайте нужное дерево в индекс и выполните:
$ git checkout-index --prefix=git-export-dir/ -a
источник
git read-tree bar:foo
И тогдаgit checkout-index --prefix=export_dir/ -a
после этого, возможно, вам следует это сделатьgit update-index master
Я написал простую оболочку,
git-checkout-index
которую вы можете использовать следующим образом:Если каталог назначения уже существует, вам нужно добавить
-f
или--force
.Установка проста; просто поместите скрипт в ваш файл
PATH
и убедитесь, что он исполняемый.Github хранилище для
git-export
источник
Похоже, что это меньше проблема с Git, чем SVN. Git только помещает папку .git в корень хранилища, тогда как SVN помещает папку .svn в каждый подкаталог. Таким образом, «svn export» избегает рекурсивной магии командной строки, тогда как в Git рекурсия не нужна.
источник
Эквивалент
внутри существующего репо
Эквивалент
является
источник
git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... Однако архивирование с метками времени не совсем тривиально, поэтому я опубликовал пример ниже .git archive branchname | tar xC otherpath
C
опцией tar является только GNU Tar.Если вы не исключаете файлы с помощью,
.gitattributes
export-ignore
попробуйтеgit checkout
а также
Кроме того, вы можете получить любую ветку или тег или конкретную ревизию, как в SVN, просто добавив SHA1 (SHA1 в Git эквивалентен номеру ревизии в SVN)
/path/to/checkout/
Должен быть пустым, Git не будет удалять любой файл, но перезаписывает файлы с таким же именем без какого - либо предупрежденияОБНОВЛЕНИЕ: чтобы избежать обезглавленной проблемы или оставить нетронутым рабочий репозиторий при использовании извлечения для экспорта с тегами, ветвями или SHA1, необходимо добавить
-- ./
в концеДвойная черта
--
говорит git, что все после черточек являются путями или файлами, а также в этом случае говоритgit checkout
не изменятьHEAD
Примеры:
Эта команда получит только каталог libs, а также
readme.txt
файл с этого коммитаЭто создаст (перезапишет)
my_file_2_behind_HEAD.txt
два коммита за головойHEAD^2
Получить экспорт из другой ветки
Обратите внимание, что
./
относительно корня хранилищаисточник
Я широко использую git-подмодули. Этот работает для меня:
источник
.htaccess
?rsync
перечисляет аргумент как--cvs-exclude
. Кроме того, он все еще копирует.gitattributes
и.gitignore
Я часто заходил на эту страницу, когда искал способ экспортировать репозиторий git. Мой ответ на этот вопрос рассматривает три свойства, которые экспорт svn имеет по дизайну по сравнению с git, так как svn следует подходу централизованного репозитория:
Экспорт определенной ветви с помощью SVN осуществляется путем указания соответствующего пути
При создании определенной версии полезно клонировать стабильную ветку, например
--branch stable
или--branch release/0.9
.источник
git archive | tar
подход неприменим к POSIX-несовместимым средам оболочки (например, CI AppVeyor на основе CMD или PowerShell), что не является идеальным.git checkout
Подход изменяет индекс основного рабочего дерева, которое ужасно.git checkout-index
Подход требует индекса основного рабочего дерева быть изменены заранее, что даже ужасно-эр. Традиционныйgit clone
подход клонирует всю историю репозитория перед удалением этой истории, что является расточительным. Это единственное вменяемое решение.file://
(например,git clone --depth 1 --branch v3.14.15 file:///home/me/src_repo trg_repo
). Невыполнение этого требования приведет к"warning: --depth is ignored in local clones; use file:// instead."
созданию и выполнению стандартного, а не поверхностного клонирования, что побеждает всю цель этого ответа. Salud!Это скопирует все содержимое, за исключением файлов .dot. Я использую это для экспорта клонированных проектов git в репозиторий моего веб-приложения без .git.
Обычный старый bash работает просто отлично :)
источник
.gitignore
, это не будет.Просто, как клон, удалите папку .git:
git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git
источник
Для пользователей GitHub
git archive --remote
метод не будет работать напрямую, так как экспортный URL является эфемерным . Вы должны спросить GitHub для URL, а затем загрузить этот URL.curl
делает это легко:Это даст вам экспортированный код в локальном каталоге. Пример:
Редактировать
Если вы хотите, чтобы код помещался в конкретный существующий каталог (а не в случайный каталог из github):
источник
Да, это чистая и аккуратная команда для архивации вашего кода без какого-либо включения git в архив, и ее хорошо передавать, не беспокоясь о истории git commit.
источник
Я просто хочу отметить, что в случае, если вы
Тогда вы можете просто использовать
cp foo [destination]
вместо упомянутогоgit-archive master foo | -x -C [destination]
.источник
Вы можете заархивировать удаленное репо при любом коммите в виде zip-файла.
источник
Bash-реализация git-export.
Я сегментировал процессы создания и удаления файлов .empty по их собственной функции с целью их повторного использования в реализации 'git-archive' (будет опубликовано позже).
Я также добавил файл «.gitattributes» в процесс, чтобы удалить ненужные файлы из целевой папки экспорта. Включение в процесс многословия и повышение эффективности функции git-export.
Empty_file = "опустошить";
источник
Если вы хотите что-то, что работает с подмодулями, это может стоить того.
Замечания:
Предположения:
источник
Я предпочитаю быть на самом деле иметь расст цель в вашем Makefile (или другой системе сборки), которая экспортирует распространяемый архив вашего кода (.tar.bz2, .zip, .jar или что-то подходящее). Если вы используете автоинструменты GNU или системы Perl MakeMaker, я думаю, что это существует для вас автоматически. Если нет, я настоятельно рекомендую добавить его.
ETA (2012-09-06): Ух, резкие спады. Я все еще верю, что лучше создавать дистрибутивы с помощью инструментов сборки, а не инструмента контроля исходного кода. Я верю в создание артефактов с помощью инструментов сборки. В моей текущей работе наш основной продукт построен с целью муравья. Мы находимся в процессе переключения систем управления исходным кодом, и наличие этой цели-муравья означает еще одну проблему при миграции.
источник
Это скопирует файлы в диапазоне коммитов (от C до G) в файл tar. Примечание. При этом будут приняты только файлы. Не весь репозиторий. Слегка изменено здесь
Пример истории коммитов
A -> B -> C -> D -> E -> F -> G -> H -> I
Страница руководства git-diff-tree
-r -> рекурсировать в поддеревья
--no-commit-id -> git diff-tree выводит строку с идентификатором фиксации, когда это применимо. Этот флаг подавил вывод идентификатора фиксации.
--name-only -> Показывать только имена измененных файлов.
--diff-filter = ACMRT -> Выбрать только эти файлы. Смотрите здесь полный список файлов
C..G -> Файлы в этом диапазоне коммитов
C ~ -> Включить файлы из Commit C. Не только файлы с Commit C.
| xargs tar -rf myTarFile -> выводит данные в tar
источник
Как я понимаю вопрос, речь идет скорее о загрузке только определенного состояния с сервера, без истории и без данных других ветвей, а не о извлечении состояния из локального репозитория (как это делают многие anwsers).
Это можно сделать так:
--single-branch
доступен с Git 1.7.10 (апрель 2012).--depth
как сообщается , является (было?) неисправным, но в случае экспорта упомянутые проблемы не должны иметь значения.источник
--depth
, который подразумевает,--single-branch
если только он--no-single-branch
не задан, что означает, что это, вероятно, имеет тот же эффект. Не уверен, хотя, какой-то эксперт может подтвердить?Мне это нужно для сценария развертывания, и я не мог использовать любой из вышеупомянутых подходов. Вместо этого я нашел другое решение:
источник
mkdir -p "$2" && git --git-dir="$1" archive HEAD | tar -x -C "$2"
но несколько длиннее.Делая это простым способом, это функция для .bash_profile, она непосредственно распаковывает архив в текущем местоположении, сначала настраивает ваш обычный [url: путь]. ПРИМЕЧАНИЕ: с помощью этой функции вы избегаете операции клонирования, она поступает непосредственно из удаленного репо.
Псевдоним для .gitconfig, требуется та же конфигурация (при выполнении команды в проектах .git ВНИМАНИЕ, она ВСЕГДА переходит к базовому каталогу ранее, как сказано здесь , пока это не исправлено, я лично предпочитаю функцию
источник
Безусловно, самый простой способ, который я видел (и также работает на Windows), это
git bundle
:git bundle create /some/bundle/path.bundle --all
Посмотрите этот ответ для более подробной информации: Как я могу скопировать мой репозиторий git со своего компьютера с Windows на компьютер с Linux через USB-накопитель?
источник
git bundle
включает в себя.git
папку, которая является то, что ОП не хочет;git archive
кажется более подходящим способом--all
коммутатор?У меня есть другое решение, которое отлично работает, если у вас есть локальная копия репозитория на компьютере, на котором вы хотите создать экспорт. В этом случае перейдите в этот каталог репозитория и введите следующую команду:
GIT_WORK_TREE=outputdirectory git checkout -f
Это особенно полезно, если вы управляете веб-сайтом с помощью git-репозитория и хотите получить чистую версию в
/var/www/
. В этом случае добавьте эту команду в.git/hooks/post-receive
сценарий ( в пустомhooks/post-receive
хранилище, которое больше подходит в этой ситуации)источник
Я думаю, что пост @Aredridel был ближе всего, но есть кое-что еще к этому - поэтому я добавлю это здесь; дело в том
svn
, что если вы находитесь в подпапке репо и делаете:затем
svn
будет экспортировать все файлы, которые находятся под контролем ревизии (они также могут иметь статус «Недавно добавлено» или «Изменено») - и если у вас есть другой «мусор» в этом каталоге (и я не считаю.svn
подпапки здесь, но видимые вещи, такие как.o
файлы) , он не будет экспортироваться; будут экспортированы только те файлы, которые зарегистрированы в репозитории SVN. Для меня одна приятная вещь состоит в том, что этот экспорт также включает файлы с локальными изменениями, которые еще не были зафиксированы; и еще одна приятная вещь - временные метки экспортируемых файлов такие же, как и у оригинальных. Или, какsvn help export
говорится:Чтобы понять, что
git
это не сохранит временные метки, сравните выходные данные этих команд (в подпапкеgit
репо по вашему выбору):... а также:
... и я, в любом случае, замечаю, что
git archive
все временные метки архивного файла одинаковы!git help archive
говорит:... но, очевидно, в обоих случаях устанавливается "время модификации каждого файла"; тем самым не сохраняя фактические метки времени этих файлов!
Итак, чтобы также сохранить временные метки, вот
bash
скрипт, который на самом деле является «однострочным», хотя и несколько сложным - поэтому ниже он размещен в несколько строк:Обратите внимание, что предполагается, что вы экспортируете содержимое в «текущую» директорию (см. Выше
/media/disk/git_svn/subdir
), а конечный объект, в который вы экспортируете, размещен несколько неудобно, но он находится вDEST
переменной окружения. Обратите внимание, что с этим сценарием; Вы должныDEST
вручную создать каталог, прежде чем запускать вышеуказанный скрипт.После запуска скрипта вы сможете сравнить:
... и, надеюсь, увидеть те же временные метки (для тех файлов, которые были под контролем версий).
Надеюсь, это поможет кому-то,
ура!
источник
экспорт git в zip-архив при добавлении префикса (например, имени каталога):
источник
Если вам также нужны субмодули, это нужно сделать: https://github.com/meitar/git-archive-all.sh/wiki
источник
У меня есть следующая служебная функция в моем файле .bashrc: он создает архив текущей ветки в репозитории git.
источник