Понимание, почему git-filter-branch не очищает мою историю - PullRequest
1 голос
/ 24 октября 2019

Я использовал gitleaks, чтобы проверить утечку секрета в моей истории репозиториев. Когда я выполнил следующую команду и принудительно нажал

git filter-branch --force --index-filter \
  'git rm -r --cached --ignore-unmatch terra/fixtures.go' \
  --prune-empty --tag-name-filter cat -- --all

, это сработало, за исключением того, что я заметил следующее:

WARNING: Ref 'refs/heads/automate_tests' is unchanged
WARNING: Ref 'refs/heads/ethRawTransaction' is unchanged
WARNING: Ref 'refs/heads/feature/177/leave-bastion' is unchanged
WARNING: Ref 'refs/heads/feature/FAQ' is unchanged
WARNING: Ref 'refs/heads/master' is unchanged
WARNING: Ref 'refs/heads/mjolnir' is unchanged
WARNING: Ref 'refs/heads/tmp' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/remotes/origin/automate_tests' is unchanged
WARNING: Ref 'refs/remotes/origin/bug/0.0.11-beta-fix' is unchanged
WARNING: Ref 'refs/remotes/origin/bug/bastion-ssh' is unchanged
WARNING: Ref 'refs/remotes/origin/bug/fix-examples-merge' is unchanged
WARNING: Ref 'refs/remotes/origin/develop' is unchanged
WARNING: Ref 'refs/remotes/origin/ethRawTransaction' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/168/auto-ssh-to-bastion' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/169/ethstats_for_pantheon' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/175/ssh-to-certain-nodes' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/176/tagging-nodes-to-ips' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/177/leave-bastion' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/FAQ' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/README' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/remotes/origin/mjolnir' is unchanged
WARNING: Ref 'refs/remotes/origin/tmp' is unchanged
WARNING: Ref 'refs/tags/0.0.4' is unchanged
WARNING: Ref 'refs/tags/20190820141131-866368a' is unchanged
WARNING: Ref 'refs/tags/20190820142202-bd96767' is unchanged
WARNING: Ref 'refs/tags/20190820143451-fc7f46a' is unchanged
WARNING: Ref 'refs/tags/20190820143903-832818a' is unchanged
WARNING: Ref 'refs/tags/20190820150546-05e3105' is unchanged
WARNING: Ref 'refs/tags/20190820154631-da0cdab' is unchanged
WARNING: Ref 'refs/tags/20190820160956-047caa6' is unchanged
WARNING: Ref 'refs/tags/20190820162243-a300fa5' is unchanged
WARNING: Ref 'refs/tags/20190820170410-47f8878' is unchanged
WARNING: Ref 'refs/tags/untagged-f148f02c4d71ed0bea99' is unchanged
WARNING: Ref 'refs/tags/v.0.0.1' is unchanged
WARNING: Ref 'refs/tags/v0.0.1' is unchanged
WARNING: Ref 'refs/tags/v0.0.1-alpha' is unchanged
WARNING: Ref 'refs/tags/v0.0.10' is unchanged
WARNING: Ref 'refs/tags/v0.0.11-beta' is unchanged
WARNING: Ref 'refs/tags/v0.0.14' is unchanged
WARNING: Ref 'refs/tags/v0.0.3-alpha' is unchanged
WARNING: Ref 'refs/tags/v0.0.4-chaos-poc' is unchanged

В результате количество утечек не кажетсячтобы идти вниз.

Я не понимаю, почему это происходит, и буду признателен за любые указатели.

Ответы [ 3 ]

1 голос
/ 24 октября 2019

У ссылок, которые git filter-branch сообщает как неизмененные, не было файла с именем terra/fixtures.go нигде в их истории. Фильтр-ветвь информирует вас, что, хотя вы и просили его обновить имена веток, чтобы они указывали на любые скопированные коммиты, в процессе никакие коммиты фактически не копировались.

Может быть интересно найти список доступных хеш-идентификаторов коммитовчто у есть такой файл, а затем запустите git branch --contains с такими хэш-идентификаторами. См. Ниже.

Какие коммиты содержат файл F?

Обратите внимание, что это другой ответ на другой вопрос. Он также ищет не коммиты, в которых какое-либо имя пути было изменено , а скорее коммиты, в которых какое-то имя пути существует вообще .

Мы начинаем с использования git rev-list для вывода списка всех коммитов:

git rev-list --all |

Вывод git rev-list представляет собой просто список хеш-идентификатора каждого коммита, который доступен из названных ревизий. В этом случае --all называет все ветви и теги вместе с другими ссылками, такими как refs/stash, но не с записями reflog.

Затем для каждого из перечисленных коммитов мы хотим проверить, содержит ли этот коммитназванный файл (ы). На данный момент вы, как правило, хотите много программируемости. Например, предположим, что имя файла a/b/c.txt. Вы также хотите найти A/B/C.TXT? Если вы используете Windows или MacOS, вы можете. Если вы работаете в Linux, вероятно, нет. Или, может быть, вы хотите найти любой файл, имя которого начинается или заканчивается каким-то шаблоном.

Здесь мы будем использовать git ls-tree -r, в котором перечислены все имена файлов,и затем запустите их с помощью команды поиска и статуса, такой как grep. Обратите внимание, что grep ищет регулярных выражений , а не шаблонов глобуса, поэтому a*b означает ноль или более a символов, за которыми следует b символ , и будет соответствовать строкам«abc.txt», «b», «flobby» и т. д.: все они имеют ноль или более a s, за которыми следует b. Мы позволим фактическим совпадающим именам проследить, чтобы человек мог применить дополнительную фильтрацию при необходимости:

git rev-list --all |
    while read hash; do
        git ls-tree -r $hash > /tmp/files
        if grep -s 'terra/fixtures\.go' /tmp/files; then
            echo "commit ${hash} :"
            grep 'terra/fixtures\.go' /tmp/files
        fi
    done
rm /tmp/files

Вывод этого набора команд, который вы, вероятно, должны поместить в файл, и которыйЯ не проверял и мог содержать ошибки - это список идентификаторов хеша коммитов, которые подходят для извлечения, но за которыми следуют совпадающие имена: вам, вероятно, следует отказаться от совпадений, например, sputerra/fixtures.gobble.

(возможнонапишите причудливые grep шаблоны, которые более точно соответствуют. В этом случае привязывает регулярное выражение с ^ и $. В более сложных случаях требуются более сложные регулярные выражения. Я оставляюэто для тех, кто использует код.)

Получив хеш-идентификаторы - запустите приведенный выше и перенаправьте в файл, очистите файл и извлеките более интересные хеш-идентификаторы - затем вы можете сделать:

git branch --contains <hash>

в любом хэше коммита, чтобы увидеть, какие ветви содержат этот конкретный коммит. Обратите внимание, что может быть ноль или более ветвей, содержащих любой данный коммит. Чтобы (намного) больше об этом, прочитайте и поймите Думайте как (а) Git .

0 голосов
/ 24 октября 2019

Попробуйте вместо new git filter-repo, который заменит старый git filter-branch или BFG

git filter-repo --use-base-name --path terra/fixtures.go --invert-paths

По умолчанию эта новая команда работает навсе филиалы. Затем git push --all --force, чтобы переопределить историю удаленного хранилища.

0 голосов
/ 24 октября 2019

Попробуйте с двойными кавычками

git filter-branch --force --index-filter \
  "git rm -r --cached --ignore-unmatch 'terra/fixtures.go'" \
  --prune-empty --tag-name-filter cat -- --all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...