Zip только последние совершенные изменения - PullRequest
21 голосов
/ 06 августа 2010

Git имеет очень удобную команду archive, которая позволяет мне сделать копию определенного коммита в архиве .zip, например так:

git archive -o ../latest.zip some-commit

Это будет содержать все рабочее дерево для этого коммита,Обычно мне просто нужны измененные файлы с предыдущего выпуска.В настоящее время я использую это, чтобы получить эти файлы в zip-архиве:

git diff --name-only previous-commit latest-commit | zip ../changes.zip -@

Однако это будет zip-файл из моей рабочей копии, который может иметь незафиксированные изменения.Есть ли какой-нибудь способ получить только измененные файлы, поскольку они были зафиксированы непосредственно в zip-файле?

Ответы [ 5 ]

42 голосов
/ 06 августа 2010

git archive будет принимать пути в качестве аргументов. Все, что вам нужно сделать, это:

git archive -o ../latest.zip some-commit $(git diff --name-only earlier-commit some-commit)

или если у вас есть файлы с пробелами (или другими специальными символами), используйте xargs:

git diff --name-only earlier-commit some-commit | xargs -d'\n' git archive -o ../latest.zip some-commit

Если у вас неправильно установлены xargs, вы можете приготовить альтернативу:

#!/bin/bash

IFS=$'\n'
files=($(git diff --name-only earlier-commit some-commit))

git archive -o ../latest.zip some-commit "${files[@]}"

Написан как скрипт оболочки, но также должен работать как однострочный. В качестве альтернативы, измените earlier-commit, some-commit и ../latest.zip на $1 $2 и $3, и вы получите многократно используемый скрипт.

4 голосов
/ 06 августа 2010

Если создание патча не вариант, то как примерно так:

git stash
git checkout latest-commit
git diff --name-only previous-commit | zip ../changes.zip -@
git checkout master
git stash apply

ПРИМЕЧАНИЕ. git stash и git stash apply нужны только в том случае, если у вас есть изменения рабочей копии, которые небыло совершено.

ПРИМЕЧАНИЕ 2: git checkout latest-commit поставит вас на голову.Обязательно наберите git checkout master, когда закончите, иначе у вас могут возникнуть проблемы с будущими коммитами.

2 голосов
/ 30 апреля 2012

Чтобы реализовать что-то полезное для решения такого вопроса для меня, я реализовал простой bash-скрипт.Сценарий принимает хэш версии и создает архив tar.gz со всеми измененными файлами, включая иерархию каталогов.Любой может использовать или изменить его, я был бы рад, если бы он кому-нибудь помог.

Просто запустите скрипт в каталоге, являющемся корнем для репозитория git, и передайте хэш редакции аргументам командной строки.

Ссылка на скрипт на hithub

1 голос
/ 23 марта 2017

Я пришел к решению, одной строкой и довольно просто:

zip archive.zip $(git diff-tree --no-commit-id --name-only -r latest-commit)

Вы также можете использовать любой другой метод архивации, например tar, с этим методом.

0 голосов
/ 06 августа 2010

почему бы не создать git-патч, который можно затем применить к другой базе кода?

$ git format-patch HEAD^..HEAD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...