Конфликт Git rebase: многие файлы удалены локально и изменены на удаленном компьютере. Как «все»? - PullRequest
0 голосов
/ 09 мая 2018

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

git rebase -Xtheirs master

Он принимает все изменения, которые я сделал для компонента , но все еще оставляет конфликты для измененных файлов из master , которые были удалены в функцию , сообщая:

CONFLICT (modify/delete): some/file1 deleted in HEAD~3 and modified in master. Version master of some/file1 left in tree.

И

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add/rm <file>..." as appropriate to mark resolution)

        deleted by them: some/path/file1
        deleted by them: other/path/file2
        deleted by them: another/path/file3
        ...

И их там миллион. Я должен запустить git rm some/path/file1 для каждого из них. Есть ли простой способ составить список всех удаленных ими файлов и автоматически передать их git rm?

Обновление: Если вы хотите попробовать это, вот очень маленький пример репозитория GitHub с этой ситуацией. Функция клонирования и проверки, затем попытайтесь выполнить ребазирование на мастер.

git clone https://github.com/chhh/git-rebase-conflict-resolution
git checkout feature
git rebase -Xtheirs master

1 Ответ

0 голосов
/ 10 мая 2018

TL; DR; oneliner:

git ls-files --stage | awk -v stage=3 -v path=4 '$stage == 2 {print $path}' | xargs git rm


Отвечая на мой вопрос, благодаря комментарию к исходному вопросу от @ torek.

git ls-files --stage выведет список удаленных ими файлов с stage == 2 .
Таким образом, используя awk и xargs, полный один вкладыш для вызова git rm на всех из них:

git ls-files --stage | awk -v stage=3 -v path=4 '$stage == 2 {print $path}' | xargs git rm

Запустите его без финального xargs, чтобы проверить, какие файлы будут удалены.

Попробуйте сами

Вот очень маленький пример репозитория GitHub с такой ситуацией. Функция клонирования и проверки, затем попытайтесь выполнить ребазинг на мастер.

git clone https://github.com/chhh/git-rebase-conflict-resolution
git checkout feature
git rebase -Xtheirs master
...