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).