Самое быстрое подсчет времени реализации почти наверняка будет с графтами и filter-branch, хотя вы могли бы добиться более быстрого выполнения с помощью commit-tree отработка последовательности rev-list вывод.
Rebase создан для применения изменений к другому содержимому. Здесь вы сохраняете содержимое и преднамеренно теряете историю изменений, которая его произвела, так что почти вся самая утомительная и медленная работа перебазирования тратится впустую.
Полезная нагрузка здесь, работающая с вашей фотографии,
echo `git rev-parse H; git rev-parse A` > .git/info/grafts
git filter-branch -- --all
Документация для git rev-parse
и git filter-branch
.
Ветвь фильтра очень тщательно следит за тем, чтобы ее можно было восстановить после сбоя в любой момент, что, безусловно, является самым безопасным .... но это действительно полезно только тогда, когда восстановление путем простого повторения не будет быстрее и проще, если дела пойдут не так. Поскольку сбои редки, а перезапуск обычно дешев, нужно выполнить не «безопасную», но очень быструю операцию, которая почти наверняка сработает. Для этого лучший вариант здесь - сделать это на tmpfs (ближайшим известным мне эквивалентом в Windows будет виртуальный диск, например ImDisk), который будет молниеносно работать и не затронет ваш основной репозиторий, пока вы не будете уверены, что получили нужные результаты.
Итак, в Windows скажем, что T:\wip
находится на виртуальном диске, и обратите внимание, что клон здесь ничего не копирует. А также читать документы на git clone
's --shared
, изучите внутренности клона, чтобы увидеть реальный эффект, это очень просто.
# switch to a lightweight wip clone on a tmpfs
git clone --shared --no-checkout . /t/wip/filterwork
cd !$
# graft out the unwanted commits
echo `git rev-parse $L; git rev-parse $A` >.git/info/grafts
git filter-branch -- --all
# check that the repo history looks right
git log --graph --decorate --oneline --all
# all done with the splicing, filter-branch has integrated it
rm .git/info/grafts
# push the rewritten histories back
git push origin --all --force
Существует достаточно возможных вариантов того, что вы можете захотеть сделать и что может быть в вашем репозитории, поэтому почти любой из параметров этих команд может быть полезен. Вышеупомянутое проверено и будет делать то, что он говорит, но это может быть не совсем то, что вы хотите.
person
jthill
schedule
23.07.2014
kill
вместо этого; что я имею в виду, что мне все равно, что с ними происходит, только мне нужны данные; например если мы сделаем снимок коммита 10004, удалим все коммиты до него и сделаем коммит 10004 корневым коммитом, я буду в порядке - person sanmai   schedule 11.06.2014git gc
прошло несколько часов, прежде чем я начал копировать старые коммиты - person sanmai   schedule 11.06.2014git filter-branch
с эффективной командой--index-filter
. Если вы используете хороший индексный фильтр, операция должна выполняться довольно быстро. - person   schedule 11.06.2014git annex
. Вы также можете изучить управление большими двоичными файлами с помощью git. Или вы можете просто продолжать уничтожать свою старую историю, когда ваше репо становится слишком большим. Вам решать. - person   schedule 11.06.2014--root
для git-rebase, поэтому этот вопрос не является одним и тем же вопросом, значит, это не дубликат. - person sanmai   schedule 23.07.2014