Я выполнил git filter-branch --index-filter 'git rm --cached --ignore-unmatched badfiles/ badfiles2/' --prune-empty
(для здесь ), чтобы удалить кучу файлов при подготовке к перемещению оставшихся файлов в другой репозиторий. --prune-empty
избавляется от любых возникающих пустых коммитов, но не влияет на слияния, что имеет смысл.
Теперь история этого конкретного репо выглядит довольно уродливо с кучей слияний, которые на самом деле ничего не добавляют, и слияниями, которые являются просто слияниями других слияний, которые фактически не добавляли никаких изменений (в переписанной истории; они возможно, был «полезен» до ответвления фильтра).
Рассмотрим этот аннотированный фрагмент (сгенерированный с git log --graph --oneline --shortstat
):
* 575e3b5 Merge pull request #68 from chris/feature # KEEP THIS MERGE!
|\
| * 5dbc3f1 Actual feature changes
| | 2 files changed, 2 insertions(+), 2 deletions(-)
| * 35abc98 Cleanup/prep
|/
| 2 files changed, 22 insertions(+), 16 deletions(-)
* c3b3d86 Merge pull request #46 from org/topic_branch-mods # USELESS-C
|\
* \ 892de05 Merge pull request #47 from org/topic_branch # USELESS-B
|\ \
| |/
|/|
| * e738d4b Merge branch 'master' into topic_branch # USELESS-A
| |\
| |/
|/|
* | 4182dac CommitMsg #40 #SQUASHED-PR
| | 2 files changed, 15 insertions(+), 6 deletions(-)
* | 3b42762 CommitMsg
|/
| 2 files changed, 29 insertions(+), 14 deletions(-)
* c4e62ba CommitMsg
| 2 files changed, 39 insertions(+), 16 deletions(-)
* c2bb13f CommitMsg
4 files changed, 241 insertions(+)
Я хотел бы сократить это до (очевидно, с другими идентификаторами в зависимости от ситуации):
* 575e3b5 Merge pull request #68 from chris/feature # KEEP THIS MERGE!
|\
| * 5dbc3f1 Actual feature changes
| | 2 files changed, 2 insertions(+), 2 deletions(-)
| * 35abc98 Cleanup/prep
|/
| 2 files changed, 22 insertions(+), 16 deletions(-)
* 4182dac CommitMsg #40 #SQUASHED-PR
| 2 files changed, 15 insertions(+), 6 deletions(-)
* 3b42762 CommitMsg
| 2 files changed, 29 insertions(+), 14 deletions(-)
* c4e62ba CommitMsg
| 2 files changed, 39 insertions(+), 16 deletions(-)
* c2bb13f CommitMsg
4 files changed, 241 insertions(+)
Итак, я хотел бы избавиться от слияний 'USELESS', которые все являются слияниями empty (без изменений слияний), но я бы хотел сохранить историю / группировку, связанную с Кроме того, «пустое» СОХРАНИТЕ слияние вверху, которое объединяет эти коммиты в один «набор изменений».
Или посмотрите на другой пример в традиционной упрощенной истории:
A -- B -- C -- D ==> A -- B --- D'
\----\--/ / \-E-/
\----E
Я пробовал решения для удаления «пустых» слияний (например, this ), но они удаляют все пустых слияний, и я хочу сохранить «полезные» пустые слияния, как показано в примерах ...
Насколько я могу судить, "бесполезные" пустые слияния не содержат никаких коммитов, которые не являются полностью левыми / верхними в истории. Есть ли способ отфильтровать их чисто? Наверное, я даже не знаю, как их описать / определить ...
Обратите внимание, что данный пример был преднамеренно простым. Для чего это стоит, позже в истории это репо выглядит так, все, что я хотел бы сократить:
* 3d37e42 Merge pull request #239 from jim/topic-dev
|\
| * 05eaf9e Merge pull request #7 from org/master
| |\
| |/
|/|
* | 1576482 Merge pull request #193 from john/master
|\ \
| * \ 187100e Merge branch 'master' of github.com:org/repo into master
| |\ \
| * \ \ 067cc55 Merge branch 'master' of github.com:org/repo into master
| |\ \ \
| * \ \ \ a69e3d2 Merge branch 'master' of github.com:org/repo into master
| |\ \ \ \
| | |/ / /
* | | | | 0ce6813 Merge pull request #212 from jim/feature
|\ \ \ \ \
| | |_|_|/
| |/| | |
| * | | | 0f5352e Merge pull request #5 from org/master
| |\ \ \ \
| |/ / / /