Git экспортировать файлы как zip/tar, так как указанный commit до сегодняшнего дня
Итак, я хочу экспортировать все файлы, начиная с определенного идентификатора фиксации до сегодняшнего дня (который может включать последующие коммиты), поэтому я делаю это:
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commitId | xargs tar -rf output.tar
Однако кажется, что это только файл вывода, который был изменен в указанном идентификаторе commit ($commitId
).
То, что я ищу, это то, что он должен экспортировать все файлы, начиная с указанного идентификатора фиксации до сегодняшнего дня (включая любые дальнейшие коммиты, которые могли произойти в течение времени).
Ответы
Ответ 1
Цитата из Git documentation:
Git diff-tree - сравнивает содержимое и режим blobs, найденный через два древовидные объекты
...
Если имеется только одно задание, коммит сравнивается с родителями (см. ниже --stdin).
В вашем случае вы даете только <tree-ish>
, чтобы он сравнивался с родителем $commitId
. Вместо этого вы должны предоставить два <tree-ish>
es для сравнения между ними.
Предполагая, что коммиты находятся на главной ветке, а главная ветка полностью обновлена; то следующая команда должна предоставить то, что вы хотите:
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT ${commitId}~1 master | xargs tar -rf output.tar
~1
после ${commitId}
делает таким образом сравнение относительно родителя ${commitId}
, иначе изменения в ${commitId}
не будут учитываться.
Ответ 2
git diff -z --name-only --diff-filter ACMRT ${commitId}~ HEAD | xargs -0 tar -rf output.tar
-
git diff
достаточно; вам не нужно использовать git diff-tree
, чтобы найти список измененных имен файлов в диапазоне фиксации.
- параметр
-z
в git diff
и -0
в xargs
обязательно использует терминаторы выходных полей NUL
, в противном случае любые пути/имена файлов с пробелами приведут к поломке вашей команды.
-
${commitId}~ HEAD
перечисляет изменения между родительским фиксатором ${commitId}
(поэтому включены изменения в этой фиксации) и самый последний commit (HEAD
).