Отменить всю историю для одного файла в одной ветке - PullRequest
0 голосов
/ 25 апреля 2018

Я создал ветку функций git в git и работал через несколько коммитов, которые были переданы в удаленный репозиторий в той же ветке.В начале своей разработки я добавил конфиденциальные данные в файл, который был зафиксирован и передан.Я не хочу удалять этот файл из ветки и истории, я просто хочу удалить все исторические изменения в этой ветке из файла и удаленного хранилища.

По сути, я хочу сделать это так, как будто никогдавнес любые изменения в один файл в моем исходном дереве в любой коммит в ветке, но все остальные изменения оставьте как есть.

Существует ли конструкция git filter-branch, которую я могу использовать для этого?Как убедиться, что изменения также удалены из удаленной ветки?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете сделать это с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...