Если цель состоит в том, чтобы иметь репозиторий с согласованными окончаниями строк, лучше переписать всю историю, используя git-filter-branch
, чем работать с ним commit-by-commit. Допустим, вам нужны последовательные окончания строки DOS.
Напишите небольшую программу, которая может преобразовывать окончания строк всех файлов в дереве каталогов, кроме .git
. Если у вас есть бинарные файлы, вам также придется их пропустить. Вот простой пример.
$ cat ~/bin/all2dos
#!/bin/sh
find . -path ./.git -prune -o -type f -print0 | xargs -0 unix2dos
Затем используйте это в tree-filter
для преобразования концов строк каждого коммита во всей истории.
$ git filter-branch --tree-filter 'all2dos' -- --all
Хотя переписывание истории страшно, оно на некоторое время полностью обратимо. Git не переписывает коммиты, он пишет новые и использует их. Ваши исходные коммиты доступны через reflog , и вы можете переместить туда свои ветви.
$ git reflog
10eed67 (HEAD -> master) HEAD@{0}: filter-branch: rewrite
e8615e3 HEAD@{1}: commit (initial): Test files
Это говорит о том, что первоначальный коммит для master
был e8615e3
, а новый переписанный - 10eed67
. Я могу переместить master
обратно к оригиналу с помощью git reset --hard e8615e3
.
Это приведет к появлению новых идентификаторов коммитов, поэтому любой, кто в данный момент работает над вашим проектом, должен будет сделать git pull --rebase=preserve
для обновления (что они должны делать в любом случае), возможно, с --ignore-cr-at-eol
, чтобы избежать конфликтов из-за изменения новой строки. Если у них есть открытые ветки, они будут на старом master
; они должны git rebase master
основать их на переписанной ветке master
.