Git неудача rebase из-за ошибки пробела

Я пытаюсь перестроить ветвь, а git вылезает из-за попытки выполнить какое-либо действие слияния, которое не выполняется. Как мне получить git, чтобы остановить это?

# git rebase -f --onto master~2 master~ master
First, rewinding head to replay your work on top of it...
Applying: r1002 - CS 1.0.23
Using index info to reconstruct a base tree...
M   about.html
<stdin>:68: trailing whitespace.                     
<stdin>:115: trailing whitespace.
<stdin>:201: trailing whitespace.
<stdin>:2369: trailing whitespace.
<stdin>:2385: trailing whitespace.
warning: squelched 2305 whitespace errors
warning: 2310 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging about.html
CONFLICT (content): Merge conflict in about.html
Failed to merge in the changes.
Patch failed at 0001 r1002 - 1002
The copy of the patch that failed is found in:
   /local/melder/tmp/test/.git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

Как вы можете видеть, есть ошибки с пробелами 2000+, а не что-то легкое для слияния вручную.

Изменить: на этот шаг теперь без слияния:

# git add -A
# git rebase --continue

Забастовкa >

Редактировать: неважно, что это глупая идея.

Ответы

Ответ 1

Сегодня я столкнулся с такой же проблемой: rebase не удается из-за конфликтов, вызванных ошибками в виде пробелов. После неудачных попыток с различными настройками для параметра whitespace (git rebase --whitespace=fix и git rebase --whitespace=nowarn) решение, которое сработало для меня, состояло в том, чтобы игнорировать конечные ошибки пробела в стратегии рекурсивного слияния (git rebase --abort любая работа с предыдущей базой, если это необходимо)

git rebase -Xignore-space-at-eol <newbase>

В зависимости от типа пробельных ошибок параметры -Xignore-space-change и -Xignore-all-space могут быть более полезными. Я не знаю, могла бы также работать опция --ignore-whitespace.

Ответ 2

что не приведет к проблеме. Теперь у вас есть маркеры конфликтов в вашем файле!

Проблема с пробелами - это предупреждения, и у вас не должно быть столько законных конфликтов. Если файл является кошмаром для разрешения, вам может потребоваться его вручную восстановить. Это зависит от того, что вы делаете, хотя.

Много раз две базы настолько различны, что каждая фиксация, которую вы перестраиваете, заставляет вас справиться с этим чудовищным конфликтом. Я склонен избегать рабочих процессов rebate и подписаться на merge/ reset. Вот что я делаю: http://dymitruk.com/blog/2012/02/05/branch-per-feature/

Если ваши проблемы - это только проблемы с пробелами, такие как окончания строк, вы можете попробовать и очистить свой репозиторий, сначала сделав ветвь фильтра или интерактивную переадресацию с каждой стороны, чтобы получить непротиворечивость каждой фиксации.

Также я использую для сравнения 3 или Perforce Merge действия для разрешения конфликтов. BC3 является синтаксисом и должен иметь дело с пробелами. Много раз он даже не откроется, так как он разрешит конфликты для вас, и вы можете просто продолжить.

Ответ 3

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

Я предлагаю вам использовать что-то вроде meld в качестве git mergetool для автоматической коррекции этих конфликтов. Когда meld запущен, установите его политику обработки пробелов (с вкладки Text filters панели Preferences), и она автоматически отрегулирует эти изменения.

Ответ 4

Сегодня я решил такую ​​проблему следующим образом:

REMOVE_AFTER="3cd7a0db76ff9dca48979e24c39b408c"
REPO="[email protected]:company/repo.git"
cd ~/tmp
git clone $REPO gitfix
cd gitfix
git checkout --orphan temp $REMOVE_AFTER
git commit -m "Truncated history"
git rebase --strategy=recursive --strategy-option=theirs --onto temp $REMOVE_AFTER master

Когда во время rebase вы получаете конфликт CONFLICT (modify/delete), который вызван удаленным файлом, вы можете решить его следующим образом:

git rm path/to/both/deleted/file
git rebase --continue

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

git add path/to/conflict/file
git rebase --continue

Когда вы закончите, rebase говорит All done. Затем вы можете:

git branch -D temp

Теперь проверьте результат:

git log --format=oneline