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 получает новые имена для переименованных файлов, а не исходные имена.