Я отделяю часть репо git для создания нового репо и пытаюсь использовать git filter-branch
для сохранения истории файлов, которые перемещаются в новый проект. Я знаю о --subdirectory-filter
, но это нехорошее решение, потому что файлы, которые я вынимаю, не отображают чисто в один подкаталог. Лучший вариант, который я нашел до сих пор, --index-filter
, используется следующим образом:
git filter-branch -f --index-filter 'git read-tree --empty && git reset -q "${GIT_COMMIT}" -- <list of files>' --prune-empty -f
Кажется, что это работает, за исключением того, что я хочу иметь возможность программно генерировать список файлов, чтобы я мог итеративно уточнять этот список. В настоящее время я пытаюсь получить список файлов, которые хочу сохранить в другом файле, и добавьте их в строку, представляющую команду, которая будет выполнена для каждого коммита, следующим образом:
tmp=$(cat ~/to_keep.txt) && git filter-branch -f --index-filter 'git read-tree --empty && git reset -q "${GIT_COMMIT}" -- '$tmp --prune-empty -f
К сожалению, это приводит к
fatal: bad flag '--prune-empty' used after filename
Даже просто эхо файлы, похоже, вызывают проблемы:
tmp=$(echo a.txt b.txt) && git filter-branch -f --index-filter 'git read-tree --empty && git reset -q "${GIT_COMMIT}" -- '$tmp --prune-empty -f
fatal: ambiguous argument 'b.txt': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Я также попытался связать строки ранее:
tmp1=$(echo a.txt b.txt) && tmp2='git read-tree --empty && git reset -q "${GIT_COMMIT}" -- ' && tmp3=${tmp2}${tmp1} && git filter-branch -f --index-filter $tmp3 --prune-empty -f
fatal: ambiguous argument 'read-tree': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Я предполагаю, что это просто конкатенация не происходит, как я ожидаю в оболочке. Кто-нибудь знает, как я могу сделать эту работу? Было бы здорово, если бы вы могли объяснить, что означают эти ошибки. Спасибо.