Только последние изменения в Zip
Git имеет очень удобную команду archive
, которая позволяет мне сделать копию конкретного коммита в архиве .zip следующим образом:
git archive -o ../latest.zip some-commit
Это будет содержать все рабочее дерево для этого фиксации. Обычно мне просто нужны измененные файлы с предыдущего выпуска. В настоящее время я использую это, чтобы получить эти файлы в zip:
git diff --name-only previous-commit latest-commit | zip ../changes.zip [email protected]
Однако это будет делать zip файлы из моей рабочей копии, которые могут иметь незафиксированные изменения. Есть ли способ получить только измененные файлы, поскольку они были переданы непосредственно в zip?
Ответы
Ответ 1
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[@]}"
Написано в виде оболочки script, но должно работать как однострочный. Альтернативно, измените earlier-commit
, some-commit
и ../latest.zip
на $1
$2
и $3
, и у вас есть многоразовый script.
Ответ 2
Если создание патча не является вариантом, то как насчет чего-то вроде этого:
git stash
git checkout latest-commit
git diff --name-only previous-commit | zip ../changes.zip [email protected]
git checkout master
git stash apply
ПРИМЕЧАНИЕ. git stash
и git stash apply
необходимы только в том случае, если у вас есть рабочие изменения, которые не были зафиксированы.
ПРИМЕЧАНИЕ 2: git checkout latest-commit
помещает вас в отдельную головку. Обязательно git checkout master
, когда вы закончите, или вы можете столкнуться с проблемами с будущими коммитами.
Ответ 3
Чтобы реализовать что-то полезное для решения такого вопроса для меня, я реализовал простой bash script. script принимает хеш-версию и создает архив tar.gz со всеми измененными файлами, включая иерархию каталогов.
Любой может использовать его или модифицировать, я был бы счастлив, если он поможет кому-то.
Просто запустите script в каталоге, который является корневым для репозитория git, и передайте хэш хеширования в командной строке argumens.
Ссылка на script на hithub
Ответ 4
Я воспользовался решением, одной строкой и довольно простым:
zip archive.zip $(git diff-tree --no-commit-id --name-only -r latest-commit)
Вы также можете использовать любой другой метод архивации, такой как tar, с помощью этого метода.
Ответ 5
почему бы не создать патч git, который затем можно применить к другой кодовой базе?
$ git format-patch HEAD^..HEAD