Git: fusion de branches publiques et privées tout en maintenant certains fichiers intacts dans les deux branches

StackOverflow https://stackoverflow.com/questions/1807036

  •  05-07-2019
  •  | 
  •  

Question

J'ai lu quelques questions idiotes ici, mais je n'ai pas trouvé de réponse à cette question:

J'ai des succursales publiques et privées dans lesquelles je souhaite autoriser la divergence de certains fichiers.

Ce sont des fichiers de configuration avec des mots de passe et mes personnalisations locales.

Je souhaite pouvoir fusionner les branches dans les deux sens: de privé à public et inversement, mais je ne souhaite pas que ces fichiers spécifiques soient automatiquement fusionnés.

Existe-t-il un moyen de configurer git de cette façon? J'aimerais trouver une solution automatisée :) - afin que la fusion puisse se faire comme d'habitude.

EDIT: voici la solution qui a fonctionné pour moi (merci à VonC pour ses conseils sur gitattribute)

la seule chose inattendue pour moi était que " fusionner la protection " commence à fonctionner uniquement après que les fichiers ont divergé dans les deux branches, pas immédiatement après l'application de la configuration suivante

.gitattributes (suivez avec git si vous voulez partager cela) ou .git / info / attributs:

file1      merge=keepmine
path/file2     merge=keepmine

keepmine est le gestionnaire de fusion personnalisé nommé, qui est simplement une commande à ne pas faire appelée à la place du pilote de fusion interne des fichiers sélectionnés, configurée sous

.

Lors de la fusion d'une branche privée vers une branche publique, je fais généralement une fusion de fichiers --squash private . De cette façon, les éditions privées n'entreront pas dans l'historique des git sur la branche publique.

.git / config:

#public repository
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = <public repo git url> 

#private repository
#has to set up with git init and populated with the initial commit to branch mybranch
[remote "private"]
    push = +:
    url = /path/to/local/private/repo 
[merge "keepmine"]
    name = dont_merge_selected_files
    driver = echo %O %A %B 
[branch "master"]
    remote = origin
    merge = refs/heads/master 

#private branch settings
[branch "mybranch"]
    remote = private
    merge = refs/heads/mybranch

s'il existe un moyen d'améliorer cela, merci de commenter

Était-ce utile?

La solution

Pour plus de sécurité, vous pouvez ajouter un attribut git (voir ici pour un exemple ) pour ces fichiers privés.

De cette façon, vous pouvez définir un script (un "gestionnaire de fusion") qui garantira que le fichier, y compris les informations confidentielles, restera vide (ou avec un contenu public) s'il est fusionné sur la branche publique, tout en conservant son contenu local si fusionné à la branche privée.
Cela signifie que vous pouvez fusionner / rebaser sans penser à ce fichier.

Autres conseils

Une solution consiste à git rebase . En conservant vos modifications privées sous forme de commits à la fin de votre maître , vous pouvez valider des éléments publics dans la branche maître (ou ce que vous choisissez comme branche de travail). , puis rebassez votre branche privée contre le maître chaque fois que vous souhaitez mettre à jour.

Une autre solution consiste à conserver les fichiers de configuration de modèles dans Git, tels que frobozz.config.template . Dans votre répertoire de travail, copiez frobozz.config.template dans le frobozz.config (non versionné), puis modifiez-le. Assurez-vous également de sauvegarder votre répertoire de travail si vous souhaitez que vos modifications locales soient sauvegardées.

Cela ne semble fonctionner que si des conflits de fusion sont détectés. La fusion entre les branches du fichier est écrasée. À moins que je ne me prépare quelque chose. Bien sûr, cela dans Windows msysgit git version 1.6.5.1.1367.

Garder les mots de passe sous contrôle de version est la pire idée de tous les temps. Vous avez besoin de CVS, pas de git, pour travailler avec des fichiers séparés. Git comme beaucoup d’autres DVCS modernes travaillant avec l’arbre entier, pas avec des fichiers séparés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top