git fusion avec des fichiers renommés

J’ai un grand site Web que je déplace dans un nouveau cadre et dans le processus en ajoutant git. Le site actuel ne dispose d’aucun contrôle de version.

J’ai commencé par copier le site dans un nouveau repository git. J’ai créé une nouvelle succursale et apporté tous les changements nécessaires pour que le nouveau cadre fonctionne. L’une de ces étapes consistait à modifier l’extension de fichier de toutes les pages.

Maintenant que j’ai travaillé sur le nouveau site, des modifications ont été apscopes aux fichiers sur l’ancien site. Donc, je suis passé à maître et copié tous ces changements dans.

Le problème est que lorsque je fusionne la twig avec le nouveau framework sur master, il y a un conflit sur chaque fichier modifié sur la twig principale.

Je ne serais pas inquiet à ce sujet, mais il y a quelques centaines de fichiers avec des modifications. J’ai essayé git rebase et git rebase --merge .

Comment fusionner ces 2 twigs sans traiter chaque fichier?

Depuis git 1.7.4, vous pouvez spécifier le seuil de renommage pour la fusion en tant que git merge -X rename-threshold=25 afin de contrôler qu’une similarité de 25% est déjà suffisante pour considérer deux fichiers renommer les candidats. Cela, en fonction du cas avec -X ignore-space-change peut rendre la détection de renommage plus fiable.

Cependant, je voulais avoir un contrôle plus direct et préparais un script connexe les derniers jours. Peut-être que ça aide – faites le moi savoir.

https://gist.github.com/894374

Devrait fonctionner automatiquement, grâce à renommer la détection. Ci-dessous, il y a un exemple de session:

 $ git init test
 Réinitialisation du repository Git vide dans /tmp/jnareb/test/.git/
 $ cp ~ / git / README.  # exemple de fichier, assez grand pour renommer les travaux de détection
 $ git add.
 $ git commit -m 'Initial commit'
 [master (root-commit) b638320] Commit initial
  1 fichiers modifiés, 54 insertions (+), 0 suppressions (-)
  créer le mode 100644 README
 $ git checkout -b new-feature        
 Passé à une nouvelle twig 'new-feature'
 $ git mv README README.txt
 $ git commit -m 'README renommé en README.txt'
 [new-feature ce7b731] Renommé README en README.txt
  1 fichiers modifiés, 0 insertions (+), 0 suppressions (-)
  renommer README => README.txt (100%)
 $ git checkout master
 Passé à la twig 'master'
 $ sed -e s / UNIX / Unix / g 'README + && mv -f README + README
 $ git commit -a -m 'README modifié'
 [master 57b1114] README modifié
  1 fichiers modifiés, 1 insertions (+), 1 suppressions (-)
 $ git fusionne nouvelle fonctionnalité 
 Fusion faite par récursif.
  README => README.txt |  0
  1 fichiers modifiés, 0 insertions (+), 0 suppressions (-)
  renommer README => README.txt (100%)

Si vous faisiez “git merge master” sur la twig “new-feature” au lieu de, comme ci-dessus, “git merge new-feature” sur “master”, vous obtiendriez:

 $ git merge master
 Fusion faite par récursif.
  README.txt |  2 + -
  1 fichiers modifiés, 1 insertions (+), 1 suppressions (-)

Pourriez-vous dire ce que vous faisiez différemment?

Notez que les “git rebase” ordinaires (et “git pull –rebase”) ne récupèrent pas les noms: vous devez lancer “git rebase -m” ou un rebase interactif.

J’ai trouvé un correctif. Comme le renommage des fichiers a été effectué par un script, j’ai pu copier les nouveaux fichiers .php et réexécuter le script avant la fusion. Comme les fichiers portaient le même nom, la fusion fonctionnait sans conflit.

Voici les étapes pour l’ensemble du processus.

  1. Créer git repo git init
  2. Copier des fichiers existants dans
  3. Commettre
  4. Exécuter un script pour renommer des fichiers
  5. Commettre
  6. Créer une twig mais ne pas la vérifier
  7. Corrigez les changements en cours de route
  8. Vérifiez la twig que vous avez créée à l’étape 6
  9. Copiez les nouvelles versions des fichiers
  10. Exécutez le script pour renommer les fichiers (cela devrait remplacer ceux du premier lancement)
  11. Commettre
  12. Checkout master
  13. fusionner la twig en maître

Cela fonctionne car pour modifier les modifications apscopes aux fichiers avec le nouveau nom.

Dans mon cas où la détection de renommage a échoué, j’ai constaté que lors de la résolution de fusion, je pouvais effectuer les opérations suivantes:

Donné:

 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. 

Exécutez ces commandes:

 git add fileA git mv fileA destB 

C’est tout ce que je devais faire. Puis je me suis engagé et la rebase a continué.

En ajoutant à la réponse de @ Tilman, avec l’option git récente, l’option de renommage est -X find-renames=