Удалить имена файлов из определенного пути?

Я играл с инструментом BFG Repo-Cleaner, чтобы очистить историю репо git, удалив (временные/большие) файлы из нескольких мест в иерархии каталогов...

то есть. /root/test/a.txt /root/test 2/a.txt

Теперь мне бы хотелось удалить все ссылки на "test/a.txt", но сохраните версию /test 2/a.txt..

Есть ли способ удалить это с помощью BFG? (как упоминалось в https://help.github.com/articles/remove-sensitive-data)

Поскольку репо имеет довольно большую историю (10K фиксирует), BFG действительно намного быстрее, чем другие методы, которые я видел до сих пор...

Ответ 1

Я разработчик BFG, и я рад, что вы нашли его полезным и быстрым. Часть особого соуса, который делает BFG настолько быстрым, состоит в том, что он не зависит от пути - поэтому вы не можете прямо сказать что-то вроде --delete /root/test/a.txt. Добавление некоторой поддержки зависимого от пути действия - это то, о чем я думаю, но я не хочу, чтобы это отрицательно влияло на производительность.

Ключевой вопрос при очистке вашего репо: чего вы пытаетесь достичь, из этих двух вариантов:

  • Уменьшение размера хранилища Git
  • Удаление личных данных

Из вашего вопроса, похоже, что ваша единственная цель - первая, уменьшить размер хранилища Git. Если /root/test/a.txt достаточно мал, то есть сопоставим по размеру с остальными законными файлами в вашем репозитории, вы не можете использовать --strip-blobs-bigger-than X, чтобы избавиться от него, так как он удалит слишком много других ваших обычных файлов. Но если это так, я бы просто расслабился и отпустил - это не стоило вам много места для хранения по сравнению со всем вашим репо.

Если /root/test/a.txt достаточно велик, чтобы вас беспокоить, вы можете просто использовать --strip-blobs-bigger-than X, чтобы избавиться от него - помните, что BFG защищает все файлы в вашей текущей фиксации (или даже больше ветвей, если вы используете --protect-blobs-from <refs>) - настолько законные большие файлы, которые вы сейчас используете, не будут затронуты.

Если вы действительно хотите избавиться от этого плохого безобидного файла, но не хотите фильтровать по размеру, есть два варианта поддержки BFG:

Используйте --delete-folders test

..., который удалит всю папку /root/test/ (и все остальные папки, называемые "test" ), но не /root/test2/. Не много пользы, если есть другие вещи в /root/test/, которые вы хотите сохранить.

Используйте --strip-blobs-with-ids <blob-ids-file>

... вам нужно найти все Git blob-идентификаторы, которые когда-либо были для /root/test/a.txt, которые вы можете сделать с помощью некоторых команд Git, таких как:

git log --format=%H -- /root/test/a.txt | xargs -IcommitId git rev-parse commitId:/root/test/a.txt