Удалить содержимое папки из истории Git, за исключением набора файлов - PullRequest
1 голос
/ 23 февраля 2020

I sh для удаления из истории git содержимого папки (которая может иметь рекурсивные папки). Однако у некоторых старых коммитов даже нет папки, в то время как у некоторых более новых коммитов есть файлы в этой папке, которые я хочу сохранить.

Допустим, папка имеет значение foo (в пути /path/to/foo), а файлы для хранения называются bar1 и bar2 (например, /path/to/foo/bar1).

Я понимаю, что эта проблема не нова. В этом вопросе используется длинный и трудно читаемый (по крайней мере, для начинающего) скрипт. Этот вопрос более актуален и использует git filter-branch, но я не понял, чем закончилось решение. Наконец, этот вопрос , вероятно, является наиболее похожим, но ответ не «рассечен» для тех, кто не обладает достаточным знанием git, чтобы понять, поэтому он не дает мне уверенности, чтобы попробовать команды .

Из того, что я видел, текущий подход для git 2.17 заключается в использовании git filter-branch для каждой ветви. Затем используйте tree-filter или index-filter (из документации я не вижу разницы в вариантах использования). Наконец, команда git rm с регулярным выражением, которое соответствует содержимому foo, за исключением bar. Первая часть регулярного выражения, вероятно, была бы простой (/path/to/foo/*), но я не уверен, как добавить исключения.

Я был бы очень признателен, если бы кто-то мог разбить все это при представлении команды, которая решает эту проблему.

1 Ответ

1 голос
/ 23 февраля 2020
git filter-branch --index-filter '
        dir=path/to/folder
        git rm -qr --cached --ignore-unmatch $dir
        git reset $GIT_COMMIT -- $dir/file1 $dir/file2 $dir/file3
'

Единственное отличие между индексным фильтром и древовидным фильтром состоит в том, что древовидный фильтр загружает дерево со всем содержимым из коммита, а затем обновляет индекс для вас, сравнивая весь контент в дереве с тем, что перечислены в индексе, обновляя индекс в соответствии с новым содержимым дерева. Это легко, просто медленно и обычно не нужно.

...