Вы можете сделать это с git filter-branch
. Самое простое - это использовать tree-filter
. (Вы можете получить более высокую производительность, настроив index-filter
, но это кажется сложнее для этой операции, и для небольшого репо tree-filter
должно быть в порядке.)
git filter-branch --tree-filter 'if test -f path/to/file; then git checkout master -- path/to/file; fi' -- --all
ОБНОВЛЕНИЕ - Я только что понял, что ответил только на половину вашего вопроса.
Как убедиться, что изменения также удалены из удаленной ветви?
В итоге вам придется принудительно толкать все затронутые ветви. Это (очевидно) переписывание истории, поэтому вам нужно будет координировать свою деятельность с кем-либо еще, у кого есть копия репо.
В идеале, прежде чем вы начнете, вы хотите, чтобы они отправили всю свою работу в начало, а затем отбросили свои клоны; тогда вы делаете переписать; тогда все снова клонируются. Если вы не можете этого сделать, то вместо этого вы можете рассматривать это как «исходную версию» (см. git rebae
документы), но понимаете, что это означает, что у каждого по-прежнему есть копия конфиденциальной информации.
На самом деле, если бы другие могли получить доступ к пульту, вы могли бы просто воспринимать всю конфиденциальную информацию в репо как скомпрометированную. Извините, но вы не можете открыть бутылку.
Но если вы по-прежнему хотите попытаться удалить копии информации, проблема в том, что переписывания истории недостаточно для удаления данных из баз данных репозитория. Таким образом, информация в настоящее время находится в
1) ваш локальный репо
2) пульт дистанционного управления
3) местный житель любого, кто клонировал пульт
У вас нет реального контроля над (3) - вот почему вам, вероятно, нужно просто считать информацию скомпрометированной. Вообще говоря, самый простой способ справиться с (2) - удалить и заново создать репозиторий (хотя в зависимости от того, как удаленно размещен хост, у вас могут быть другие варианты).
У вас есть больше возможностей для (1), но опять же, проще всего заменить локальное репо, то есть путем его клонирования. Например, после того, как вы сделали историю переписать локально
cd ..
git clone file://localhost/path/to/rewritten/repo clean_repo
А потом перестраивать все из clean_repo