git archive: как игнорировать pathspec во время архивирования?

Я пытаюсь создать архив файлов за последние 3 коммита, используя следующую команду.

git archive -o archive.zip $(git diff --name-only HEAD~3)

Но в последнем коммите я удалил несколько файлов, это показано в diff выход. поэтому я получаю эту ошибку:

fatal: pathspec 'public/uploads/5839529ba9381.png' did not match any files

Как мне игнорировать файлы, которые были удалены в коммите во время git-архива? Я попробовал --ignore-unmatch аргумент, но это не работает.

3 ответа

Я был в той же ситуации, вот что-то, что работает.

tar vczf archive.tar.gz --ignore-failed-read `git diff --name-only hash1 hash2`

Я тоже искал, git архив игнорировал удаленные файлы. Как я хотел создать архив файлов, которые были добавлены / изменены между двумя ветками / тег / хэш и т. Д.

Решение заключается в использовании tar вместо git-архива и передать вывод git diff таким же образом, единственным преимуществом здесь является то, что вы можете фактически игнорировать отсутствующие файлы (удаленные между фиксациями), используя флаг --ignore-failed-read, Также следует отметить, что этот флаг должен стоять после имени файла архива.

По существу, git archive используется для резервного копирования состояния определенного момента времени, не подходит для резервного копирования изменений временной шкалы, т. е. вы не можете сохранить действие delete files от git archive,

Если вы хотите сделать резервную копию последних 3 коммитов, вы можете использовать git bundle команда.

git bundle create last_three_commit.bundle HEAD~3..HEAD

или же

git bundle create last_three_commit.bundle -3 HEAD    

Пожалуйста, запустите git bundle --help Больше подробностей.

Это сработало для меня:

      git archive -o archive.zip $(git diff --name-only --no-renames --diff-filter=a hash1..hash2)

Где hash1 — это хеш нового коммита, а hash2 — старого коммита.

--no -renames получает новые имена для переименованных файлов, а не исходные имена.

Другие вопросы по тегам