git merge с переименованными файлами - PullRequest
44 голосов
/ 24 апреля 2010

У меня есть большой веб-сайт, который я перемещаю в новую среду и в процессе добавления git. На текущем сайте нет контроля версий.

Я начал с копирования сайта в новый репозиторий git. Я сделал новую ветку и внес все изменения, которые были необходимы, чтобы он работал с новой структурой. Одним из таких шагов было изменение расширения файлов всех страниц.

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

Проблема в том, что когда я объединяю ветвь с новой платформой обратно в мастер, возникает конфликт в каждом файле, который был изменен в мастер ветке.

Меня бы это не волновало, но есть пара сотен файлов с изменениями. Я попытался git rebase и git rebase --merge без удачи.

Как я могу объединить эти 2 ветви, не имея дело с каждым файлом?

Ответы [ 5 ]

59 голосов
/ 30 марта 2011

Начиная с git 1.7.4, вы можете указать порог переименования для слияния как git merge -X rename-threshold=25, чтобы контролировать, что сходство в 25% уже достаточно для рассмотрения двух файлов кандидатов на переименование. Это, в зависимости от случая вместе с -X ignore-space-change, может сделать обнаружение переименования более надежным.

Однако я хотел иметь более прямой контроль и готовил соответствующий сценарий в последние дни. Может быть, это поможет - дайте мне знать.

https://gist.github.com/894374

16 голосов
/ 28 апреля 2010

Должен работать автоматически, благодаря обнаружению переименования. Ниже приведен пример сеанса:

$ git init test
Initialized empty Git repository in /tmp/jnareb/test/.git/
$ cp ~/git/README .    # example file, large enough so that rename detection works
$ git add .
$ git commit -m 'Initial commit'
[master (root-commit) b638320] Initial commit
 1 files changed, 54 insertions(+), 0 deletions(-)
 create mode 100644 README
$ git checkout -b new-feature        
Switched to a new branch 'new-feature'
$ git mv README README.txt
$ git commit -m 'Renamed README to README.txt'
[new-feature ce7b731] Renamed README to README.txt
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename README => README.txt (100%)
$ git checkout master
Switched to branch 'master'
$ sed -e 's/UNIX/Unix/g' README+ && mv -f README+ README
$ git commit -a -m 'README changed'
[master 57b1114] README changed
 1 files changed, 1 insertions(+), 1 deletions(-)
$ git merge new-feature 
Merge made by recursive.
 README => README.txt |    0
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename README => README.txt (100%)

Если бы вы выполняли «git merge master» в ветке «new-feature» вместо, как и выше, «git merge new-feature» в «master», вы получите:

$ git merge master
Merge made by recursive.
 README.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

Не могли бы вы сказать, что вы делали по-другому?

Обратите внимание, что обычные git rebase (и git pull --rebase) не принимают переименования: вам нужно запустить git rebase -m или интерактивную rebase.

2 голосов
/ 16 октября 2012

В моем случае, когда обнаружение переименования не удалось, я обнаружил, что во время разрешения слияния я мог сделать следующее:

Дано:

fileA: A modified file that was moved to the new place but is currently in the old place.
destB: The location where fileB was moved to. This could include a new filename.

Запустите эти команды:

git add fileA
git mv fileA destB

Это все, что я должен был сделать. Затем я совершил, и перебазирование продолжилось.

2 голосов
/ 26 апреля 2010

Я разобрался с исправлением. Поскольку переименование файлов было выполнено с помощью сценария, я смог скопировать новые файлы .php и повторно запустить сценарий перед объединением. Поскольку файлы имели одинаковое имя, объединение работало без конфликтов.

Вот шаги для всего процесса.

  1. Создание git-репо git init
  2. Копировать существующие файлы в
  3. Commit
  4. Запустить скрипт для переименования файлов
  5. Commit
  6. Создайте ветку, но не проверяйте ее
  7. Исправлять изменения, внося изменения по ходу
  8. Оформите ветку, которую вы сделали на шаге 6
  9. Копирование новых версий файлов
  10. Запустить скрипт для переименования файлов (он должен заменить те, что были при первом запуске)
  11. Commit
  12. Оформить заказ мастеру
  13. объединить ветку в мастер

Это работает, потому что для git были внесены изменения в файлы с новым именем.

0 голосов
/ 26 сентября 2017

Добавление к ответу @ Tilman, с последним git, опция переименования - -X find-renames=<n>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...