Git экспорт точно так же, как экспорт SVN
Можно ли экспортировать только файлы из одной ревизии из удаленного репозитория Git? В Subversion мы можем легко сделать это:
svn export https://some.website.com/trunk/app/etc@5317 --username=user --password=pass --force -r 5317 ./build/trunk/app
Это даст мне только файлы, которые были изменены в ревизии 5317, и ничего больше. Почему это невозможно в Git?
Примечание: я уже читал, как сделать "экспорт git" (например, "экспорт svn"), но все ответы относятся к некоторому варианту клонирования всего хранилища. Мне не нужно целое дерево работы. Мне просто нужно несколько файлов. Мой репозиторий составляет 4,5 гигабайта, а моя система сборки FTP размещена на виртуальной машине и требует ограниченного дискового пространства. Любая помощь приветствуется.
4 ответа
Это даст мне только файлы, которые были изменены в ревизии 5317, и ничего больше. Почему это невозможно в Git?
Там нет кнопки для этого, потому что git fetch
или любой из нескольких других способов git лучше, но выгрузка полного содержимого файлов, измененных в коммите
git clone --no-checkout . ../scratch # dirt cheap
( cd ../scratch
git diff-tree --name-only -r commit^! | xargs git checkout commit --
git ls-files | tar czTf - ../export.tgz
)
rm -rf ../scratch
Отличный способ сделать минимальные выборки - начать с мелкого клона. Это можно сделать способом ex post facto, и даже вообще не иметь ничего в объектной базе данных, но если дисковое пространство не является какой-то нелепой премией, то git способ сделать это с вашего удаленного сайта
git clone --depth=1 -b mainbranch u://r/l
и с тех пор, просто
git pull
быть в курсе
Увидеть man git-archive
,
Также см. Этот связанный вопрос.
После этого вы можете делать то, что хотите, например:
git archive --remote=<repo> --output=repo-master.zip master
Вы можете использовать этот инструмент https://github.com/hegoku/git-export, установить его и когда вы хотите экспортировать измененные файлы между двумя коммитами в папку:
$ git-export -o /home/path_of_folder commit_1 commit_2
или если вы просто хотите экспортировать измененные файлы из определенного коммита в папку:
$ git-export -o /home/path_fo_folder commit_1
Использовать
--work-tree
Это заставляет вас также использовать
--git-dir
чтобы указать на ваш каталог .git.
--git-dir=.git
предполагает, что вы находитесь в папке git. Вы, конечно, можете вызвать эту команду из любого другого места, настроив эту папку.
Следующее будет извлекать файлы в любой выбранный вами каталог. Сюда не входят локальные (незафиксированные) изменения в существующем рабочем дереве. Он включает изменения в индексе (поместите туда с помощью
git add
)
git --git-dir=.git --work-tree=/folder/into/which/to/export/ restore .
Использовать
--source=HEAD
игнорировать индекс.
git --git-dir=.git --work-tree=/folder/into/which/to/export/ restore --source=HEAD .
Или вы можете использовать
--source
чтобы указать любую фиксацию, которую вы хотите (ветвь, тег, хэш).
git --git-dir=.git --work-tree=/folder/into/which/to/export/ restore --source=my-tag .
И вы даже можете ограничить какой-то путь внутри вашего репозитория git.
git --git-dir=.git --work-tree=/folder/into/which/to/export/ restore --source=HEAD:path/in/your/repo .
Если вы хотите, чтобы часть структуры папок (для подпути) была создана в папке назначения
git --git-dir=.git --work-tree=/folder/into/which/to/export/ restore --source=HEAD:path/in/ your/repo
Пока только экспорт
path/in/your/repo
. Но создает каталог
/folder/into/which/to/export/your/repo
.