Git - видалення комітів з порожнім набором змін за допомогою фільтра-гілки


75

Як видалити коміти, які не мають набору змін, використовуючи git filter-branch?

Я переписав свою історію git, використовуючи:

git filter-branch --tree-filter 'rm -r -f my_folder' -f HEAD

це вдалося добре, але зараз у мене багато комітів з порожніми наборами змін. Я хотів би видалити ці коміти. Бажано в msysgit.

Перебазування насправді не є варіантом, оскільки у мене понад 4000 комітів, і половина з них повинна бути видалена.


4
Для відвідувачів в майбутньому, --index-filterз git rm -r --ignore-unmatch --cached my_folderнабагато швидше , ніж , --tree-filterяк він не повинен перевірити кожну версію. Він повністю працює на індексі.
vmrob

3
І якщо ви вже виконали роботу ( --tree-filter ...) і тепер просто хочете позбутися затяжних порожніх комітів, це зберегло мій бекон: git filter-branch --prune-empty(просто filter-branchкоманда без будь-якого `` фільтра '') - як знайдено у stackoverflow.com/questions/28313664 / ... - це корисно, коли відповідь Джефромі нижче ( stackoverflow.com/questions/5324799/… ) видає звіт про помилкуFound nothing to rewrite
Гер Хоббельт,

Відповіді:


71

Просто додайте --prune-emptyопцію:

git filter-branch --tree-filter 'rm -rf my_folder' --prune-empty -f HEAD

(І звичайно, якщо у вас є інші посилання, ви можете переписати все, -- --allа не просто HEAD.)

Зверніть увагу, що це несумісно з --commit-filter; у такому випадку Чарльз Бейлі має вашу відповідь .


50

Просто переглянувши документацію filter-branch, ви зможете зробити це:

git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' HEAD

4
+1 за це. Дуже корисно, якщо ви перетворили сховище svn, яке зазвичай генерує багато порожніх комітів
Fabio

Ця команда не видаляє всі порожні коміти у моєму випадку, але, на жаль, я не знаю, чому. Будь-яка інша ідея?
SeB.Fr

2
@ SeB.Fr: Я не знаю, чи це у вас ситуація, але можливо така ?
CB Bailey

Він видає мені це повідомлення: fatal: неоднозначний аргумент '$ @' ': невідома редакція або шлях, що не знаходиться у робочому дереві. Використовуйте '-', щоб відокремити шляхи від версій, наприклад: 'git <command> [<revision> ...] - [<file> ...]'
Олександр Пучков

Оновлення: воно не працювало в Windows 10, але, на щастя, всередині оновлення ювілею Windows 10 є ubuntu. Там добре працювали
Олександр Пучков
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.