Удалить каталог из всех предыдущих коммитов - программирование
Подтвердить что ты не робот

Удалить каталог из всех предыдущих коммитов

Git Репо, существует папка ABC с тремя файлами, все из которых имеют пробелы в имени file - 1.ext, file - 2.ext и file - 3.ext. Я хочу удалить папку и файлы. Я знаю только, как удалить файлы с помощью этой команды

git filter-branch --index-filter 'git rm --cached --ignore-unmatch FILE' \--prune-empty --tag-name-filter cat -- --all

тогда вы git push origin master --force.

(1) Но как удалить папку ABC и ее файлы со всех предыдущих коммитов?

Кроме того, файлы имеют пробелы в имени, а следующее не обнаруживает их в транзакции репо:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file\ -\ 1.ext' \--prune-empty --tag-name-filter cat -- --all

(2) должен ли синтаксис удалять файлы с пробелами в именах? Примечания

  • OSX
  • GitHub
4b9b3361

Ответ 1

Скажите, что вы начинаете с истории

$ git lola --name-status
* e709131 (HEAD, master) bar
| A     bar
* 61493ac ABC/file - 3.ext
| A     ABC/file - 3.ext
* 34cce9e ABC/file - 2.ext
| A     ABC/file - 2.ext
* 115e6d5 ABC/file - 1.ext
| A     ABC/file - 1.ext
* 5ea5b42 foo
  A     foo

Примечание: git lola - нестандартный, но очень полезный псевдоним.

git rm поддерживает параметр для удаления поддеревьев.

-r
Разрешить рекурсивное удаление при указании имени ведущего каталога.

После запуска

$ git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch ABC' \
  --prune-empty --tag-name-filter cat -- --all

вы увидите вывод, похожий на

Rewrite 115e6d5cd06565ca08f1e5c98c4b91246cf59fa1 (2/5)rm 'ABC/file - 1.ext'
Rewrite 34cce9e90f832460137e620ebacc8a73a99e64ce (3/5)rm 'ABC/file - 1.ext'
rm 'ABC/file - 2.ext'
Rewrite 61493ac3211808f34f616dbc33d51d193b3f45a3 (4/5)rm 'ABC/file - 1.ext'
rm 'ABC/file - 2.ext'
rm 'ABC/file - 3.ext'
Rewrite e709131f1fe6103adf37616c9fa500994aeb30d0 (5/5)rm 'ABC/file - 1.ext'
rm 'ABC/file - 2.ext'
rm 'ABC/file - 3.ext'

Ref 'refs/heads/master' was rewritten

Если вы довольны результатом, удалите старого мастера с помощью

$ git update-ref -d refs/original/refs/heads/master

и теперь у вас есть история

$ git lola --name-status
* 19680d4 (HEAD, master) bar
| A     bar
* 5ea5b42 foo
  A     foo

Чтобы ответить на второй вопрос, скажите, что вы хотите удалить только ABC/file - 2.ext. Помните, что вам понадобятся два слоя кавычек: один слой для всей команды, а другой - чтобы избежать пробелов в аргументе этой команды, имя файла для удаления.

Один из способов сделать это -

$ git filter-branch --index-filter \
  'git rm --cached --ignore-unmatch "ABC/file - 2.ext"' --prune-empty \
  --tag-name-filter cat -- --all

Обратите внимание на двойные кавычки внутри одиночных кавычек.

Если вы запустили эту команду, ваша история стала бы

$ git lola
* a8d1b0d (HEAD, master) bar
* cff0c4e ABC/file - 3.ext
* 115e6d5 ABC/file - 1.ext
* 5ea5b42 foo

Ответ 2

Вместо использования --index-filter попробуйте с --tree-filter:

--tree-filter <command>
    This is the filter for rewriting the tree and its contents. The argument is
    evaluated in shell with the working directory set to the root of the
    checked out tree. The new tree is then used as-is
    (new files are auto-added, disappeared files are auto-removed -
    neither .gitignore files nor any other ignore rules HAVE ANY EFFECT!).

Командная строка:

git filter-branch --tree-filter 'rm -rf path/to/ABC' \
  --prune-empty --tag-name-filter cat -- --all