Почему опция --cached в filter-branch удаляет файлы из рабочего каталога? - PullRequest
6 голосов
/ 07 августа 2011

Мне нужно было удалить некоторые файлы Xcode из старого репозитория, которые должны были быть проигнорированы.Поэтому я выполнил следующую команду

git filter-branch --index-filter 'git rm -f --cached --ignore-unmatch *mode1v3 *pbxuser' HEAD

Насколько я понимаю, добавление --cached не повлияет на текущий рабочий каталог, но git также удалил эти подходящие файлы.К счастью, у меня была резервная копия (!), Но мне любопытно, почему это происходит, или я неправильно понимаю, что делает --cached?

Ответы [ 2 ]

4 голосов
/ 13 августа 2011

Виновником является не команда git rm. Его опция --cached действительно работает, как вы говорите. Вы можете легко попробовать это в маленьком git-репо.

Хотя на странице руководства это не упоминается, git filter-branch, похоже, не сохраняет вашу рабочую область. На самом деле команда отказывается запускаться, если ваша рабочая зона не чистая, что уже является показанием.

Но даже если файлы ушли из рабочей области, они не ушли из репо. Их больше нет в коммитах, доступных в вашей текущей ветке. Но хранилища веток фильтра - это ссылка на вашу ветку перед тем, как переписать ссылку на пространство имен refs / original /.

Используйте команду git show-ref, чтобы увидеть ее.

Вы можете проверить старую версию для доступа к удаленным файлам. Вы можете использовать команду git cat-file blob refs/original/refs/heads/master:foo чтобы получить содержимое файла без извлечения (используйте ссылку, указанную в show-ref, foo - имя нужного файла). Есть много возможностей

Вы можете использовать gitk --all для навигации как по вашей переписанной, так и по текущей ветке, и вы увидите, что на самом деле ничего не пропало.

1 голос
/ 15 апреля 2013

Поведение git-filter-branch может показаться удивительным, как вы обнаружили, и оно не защитит вас от непредвиденных последствий при запуске.

Вместо этого я бы рекомендовал использовать BFG Repo-Cleaner , более простая и быстрая альтернатива, специально разработанная для удаления файлов из истории Git.Одним из способов облегчения вашей жизни здесь является то, что будет не удалять или каким-либо образом изменять , файлы в вашем последнем коммите .

Вы должны следовать инструкциям по использованию - но основной бит такой: скачайте банку BFG (требуется Java 6 или выше) и выполните эту команду:

$ java -jar bfg.jar  --delete-files *{mode1v3,pbxuser}  my-repo.git

Любой файл, соответствующий этому выражению в истории вашего репозитория - который также отсутствует в вашем последнем коммите - будет удален.Затем вы можете использовать git gc для удаления мертвых данных:

$ git gc --prune=now --aggressive

BFG, как правило, намного проще в использовании, чем git-filter-branch - параметры адаптированы к этим двум распространенным сценариям использования:

  • Удаление Сумасшедшие большие файлы
  • Удаление Пароли, учетные данные и другие Личные данные

Полное раскрытие: я являюсь автором репо-уборщика BFG.

...