Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/01/2013, à 22:07

Autiwa

[Résolu] git, déplacer dans une branche les modifs d'un fichier

J'ai un problème que je trouve complexe, et je n'ai pas trouvé de solution évidente dans la doc de Git. Je me résigne donc à poser la question à la communauté en espérant que quelqu'un pourra me donner un coup de main.

J'ai un code, dont le développement est suivi sur un dépot Git. C'était un dépot pour moi à la base, mais petit à petit l'idée de donner la possibilité à quelqu'un de l'utiliser aussi fait son chemin. Il y a une partie du code (qui n'est pas de moi à la base) qui est générique. Et une partie du code qui fait partie des "modifications utilisateurs" où j'ai rajouté énormément de choses. J'ai fait des modifs dans la partie principale aussi, mais les deux sont décorellées.

Maintenant, je souhaiterais faire un master contenant uniquement le code générique, et une branche contenant toutes les modifs que je fais dans la partie utilisateur (cette partie utilisateur restant vierge dans la branche master. Sauf que pour l'instant, la branche n'existe pas, et toutes mes modifs utilisateurs sont dans master. Ces modifs sont dans des fichiers à part que j'ai créé et qui n'existaient pas dans le code original -sauf pour un fichier-.

Est-ce que quelqu'un a une idée?

Mon soucis c'est que si je fais un truc à la barbare, quand je vais créer ma branche pour remettre les modifs, vu que dans master le fichier sera quasi vierge, il va vouloir me le modifier et tout me nettoyer. Je m'en remets à vos idées. Si d'ici quelques jours rien n'a émergé, je vais tenter une solution à la barbare.

Merci à tous pour le temps que vous consacrerez à mon soucis.

Dernière modification par Autiwa (Le 04/02/2013, à 12:53)


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne

#2 Le 02/02/2013, à 00:53

cervo

Re : [Résolu] git, déplacer dans une branche les modifs d'un fichier

Suis pas tout à fait sûr mais tu peux utiliser la comment git stash je pense (cf http://www.alexgirard.com/git-book/4_le … hing).html)
Si j'ai bien tout compris, dans ton master courant, où tu as toutes tes modifs :

git stash "sauvegarde du travail en cours" // pour sauvegarder tes modifs
git pull origin master // pour récupérer le master d'origin
git checkout -b nom_de_ta_nouvelle_branch // pour créer ta nouvelle branche
git stash apply // pour récupérer tes modifs sauvegardées par le gut stash

Hors ligne

#3 Le 03/02/2013, à 22:21

Autiwa

Re : [Résolu] git, déplacer dans une branche les modifs d'un fichier

Le problème, c'est que je voudrais avoir dans la nouvelle branche, tout l'historique, et non simplement la dernière version des fichiers.

De plus, ce n'est pas l'ensemble des modifs que je souhaite déplacer, mais seulement celles sur un nombre très restreint de fichier. La plupart des fichiers du master doivent rester là.

Mais je ne pense pas que ma demande ait une réponse propre avec Git, vu que c'est dû à une erreur de ma part à la base.


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne

#4 Le 03/02/2013, à 22:31

HP

Re : [Résolu] git, déplacer dans une branche les modifs d'un fichier

git-cherry-pick - Apply the changes introduced by some existing commits

cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#5 Le 04/02/2013, à 12:53

Autiwa

Re : [Résolu] git, déplacer dans une branche les modifs d'un fichier

Merci pour cette commande que je ne connaissais pas, elle a l'air de faire ce que je pouvais espérer de mieux.

Dans la pratique j'ai plutôt créé une branche qui est mon 'master' effectif. Je conserve ainsi l'historique de manière propre et permet aux gens de synchroniser sur la branche que je viens de créer. Ce n'est pas optimum, mais ça limite les bidouillages à la con que j'aurais dû faire.

Merci pour votre aide !


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne

#6 Le 05/02/2013, à 15:23

Autiwa

Re : [Résolu] git, déplacer dans une branche les modifs d'un fichier

Finalement, j'ai testé cherry-pick hier soir. Ça m'a pris 3 ou 4 heures, et ça ne fonctionnait pas, je me suis embourbé dans les conflits.

J'ai trouvé une autre technique, à base de patch.

Ainsi, j'ai récupéré toutes les modifs des fichiers qui m'intéressaient (et uniquement eux) via la commande suivante, qui copie séparément dans différents fichiers .patch chaque commit qui a apporté une modification à un de ces fichiers :

git format-patch --output-directory ../myPatch 7552b3a2fb57..dabfc11cce3884fa1e -- user_module.f90 bessel.f90 contour.f90 disk.f90 disk_properties.f90 iso_fortran_env.f90 resultant_torque.f90 test_disk.f90 total_torque_study.f90 turbulence.f90 maketest.py

Ensuite, j'ai créé un petit fichier python tout simple qui me permet d'appliquer chaque patch séparément et de faire un commit séparé pour chacun d'entre eux. Je vais chercher l'ancien texte de log pour le recopier dans le nouveau log.

Le fichier python est le suivant :

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# will apply a list of patch separately, and create one commit for each single patch

import autiwa
import pdb

(process_stdout, process_stderr, return_code) = autiwa.lancer_commande("ls ../myPatch/*.patch")
if (return_code != 0):
  print("the command return an error "+str(return_code))
  print(process_stderr)
  exit()
  
patches = process_stdout.split("\n")
patches.remove('') # we remove an extra element that doesn't mean anything
nb_patchs = len(patches)

patches.sort()

for patch in patches:
  # Apply patch
  cmd = "git apply %s" % patch
  autiwa.lancer_commande(cmd)
  
  # Get corresponding hashID
  patchText = open(patch, 'r')
  tmp = patchText.readline()
  patchText.close()
  hashID = tmp.split()[1]
  
  # Get log text
  cmd = 'git log --pretty=format:"%%s" %s -1' % hashID
  (logText, process_stderr, return_code) = autiwa.lancer_commande(cmd)
  
  # Get untracked files
  cmd = 'git ls-files --other --exclude-standard'
  (process_stdout, process_stderr, return_code) = autiwa.lancer_commande(cmd)
  
  if (return_code != 0):
    print("the command return an error "+str(return_code))
    print(process_stderr)
    exit()
  
  untracked_files = process_stdout.split("\n")
  untracked_files.remove('') # we remove an extra element that doesn't mean anything
  
  # Add untracked files
  cmd = 'git add %s' % (' '.join(untracked_files))
  (process_stdout, process_stderr, return_code) = autiwa.lancer_commande(cmd)
  
  # Commit the modif
  cmd = 'git commit -a -m "%s"' % logText
  autiwa.lancer_commande(cmd)

Le module 'autiwa' n'étant pas recopié ici, voici le contenu de la fonction en question, utilisant le module subprocess :

def lancer_commande(commande):
  """lance une commande qui sera typiquement soit une liste, soit une 
  commande seule. La fonction renvoit un tuple avec la sortie, 
  l'erreur et le code de retour"""
  if (type(commande)==list):
    process = subprocess.Popen(commande, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  elif (type(commande)==str):
    process = subprocess.Popen(commande, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
  else:
    raise TypeError("The command is neither a string nor a list.")
  (process_stdout, process_stderr) = process.communicate()
  returncode = process.poll()
  # there is .poll() or .wait() but I don't remember the difference. For some kind of things, one of the two was not working
  return (process_stdout, process_stderr, returncode)

J'ai donc recopié ci-dessus la solution que j'ai employé, au cas où ça serve à quelqu'un. J'aurais voulu supprimer ces modifs là de la branche 'master' mais je n'ai pas trouvé comment faire. J'ai donc fait un commit qui efface ces modifications de master, puis j'ai créé une branche qui remet ces modifications là.

Je ne sais pas encore comment cette technique va réagir à des updates et des rebase, mais je vais rapidement être fixé.

Dernière modification par Autiwa (Le 05/02/2013, à 15:24)


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne

#7 Le 05/02/2013, à 16:12

HP

Re : [Résolu] git, déplacer dans une branche les modifs d'un fichier

Autiwa a écrit :

Je ne sais pas encore comment cette technique va réagir à […] des rebase, […]

Ouais… si on utilise majoritairement rebase, faut pas trop s'étonner des conflits… non ?!


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#8 Le 05/02/2013, à 16:16

Autiwa

Re : [Résolu] git, déplacer dans une branche les modifs d'un fichier

Je ne sais pas comment implémenter les modifs de master dans une branche autrement. Mais il y a peut-être mieux.

Le soucis des conflits, c'était pour cherry-pick, c'était un problème parce que j'avais plusieurs centaines de commits à faire, dont beaucoup ne servaient pas pour la branche (ils étaient donc vide une fois la gestion du conflit effectuée).

Normalement, la majorité des fichiers de master ne sont pas modifiés dans la branche, je ne suis pas censé avoir beaucoup de soucis de conflits de ce coté là.


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne

#9 Le 05/02/2013, à 16:49

HP

Re : [Résolu] git, déplacer dans une branche les modifs d'un fichier

Autiwa a écrit :

Je ne sais pas comment implémenter les modifs de master dans une branche autrement.

git-merge - Join two or more development histories together

cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#10 Le 05/02/2013, à 16:56

Autiwa

Re : [Résolu] git, déplacer dans une branche les modifs d'un fichier

Je viens de tester, il ne m'a pas demandé mon avis et a fusionné les modifs. Du coup il y a un conflit alors qu'il n'en a pas vu. Shit.

Merci pour la commande ! (non, c'est pas du tout ironique, je vais utiliser ça maintenant, au lieu de rebase)


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne