Git фильтр-ветвь только для разветвленных коммитов - PullRequest
2 голосов
/ 13 января 2020

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

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

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

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch filename.txt' --prune-empty @

Между ними есть многочисленные слияния.

master         A---B---C---D---E---F---G (HEAD)
                  /       /
upstream/master  H---I---J---K

[1] https://help.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository

Ответы [ 2 ]

1 голос
/ 18 января 2020

Я еще не смотрел команду filter-repo, но вы можете указать filter-branch точный список коммитов, которые вы хотите изучить, все, что после того, как -- arg будет передано rev-list filter-branch работает для генерации своих кандидатов, например

git filter-branch --index-filter "$myfilter" -- --first-parent HEAD
1 голос
/ 14 января 2020

Я рекомендую использовать новый инструмент git filter-repo, который заменяет BFG и git filter-branch.

Примечание: если вы получаете следующее сообщение об ошибке, когда Выполнение вышеупомянутых команд:

Error: need a version of `git` whose `diff-tree` command has the `--combined-all-paths` option`

это означает, что вам необходимо обновить git.


См. " Фильтрация на основе пути":

git filter-repo --path file-to-remove --invert-paths

Вы можете объединить его с фильтрацией ссылок: сначала добавьте URL-адрес исходного репо (который вы разветвили) в локальное репо:

cd /path/to/local/clone/of/my/fork
git remote add upstream /url/original/repo
git fetch upstream

То Кстати, вы можете ограничить фильтрацию только вашими коммит-коммитами.
Вот пример, предполагающий, что вы добавили коммиты поверх upstream/master.

git filter-repo --path file-to-remove --invert-paths \
  --refs upstream/master..<myBranch>
...