Подтвердить что ты не робот

Только последние изменения в 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?

4b9b3361

Ответ 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