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.

Другие вопросы по тегам