2009-11-27 13 views
22

ich ein paar git Fragen hier gelesen haben, aber nicht eine Antwort auf diese finden konnte:Git: Fusion öffentliche und private Zweige während, während bestimmte Dateien in beiden Zweigen intakt zu halten

ich eine öffentliche und eine Privat Zweige, in denen ich bestimmte Dateien divergieren lassen möchte.

Das sind Konfigurationsdateien mit Passwörtern und meinen lokalen Anpassungen.

Ich möchte in der Lage sein, die Zweige auf beide Arten zusammenzuführen: von privat zu öffentlich und zurück, aber ich möchte diese spezifischen Dateien nicht automatisch zusammenführen lassen.

Gibt es eine Möglichkeit, git so einzurichten? Ich würde gerne eine automatisierte Lösung finden :) - so könnte das Zusammenführen wie gewohnt erfolgen.


EDIT: hier ist die Lösung, die für mich (Danke an VonC für die Beratung auf gitattribute) arbeitete

das einzige für mich unerwartet war, dass „Schutz verschmelzen“ zu arbeiten beginnt erst nach Dateien in den beiden Zweigen abwich, nicht unmittelbar nach der folgenden Konfiguration wurde

.gitattributes angewendet (Track mit git, wenn Sie diese teilen möchten) oder .git/info/Attribute:

file1  merge=keepmine 
path/file2  merge=keepmine 

keepmine ist der genannte benutzerdefinierte merge-Manager, der nur ein do-nothing-Befehl anstelle den internen Merge-Treiber auf ausgewählte Dateien aufgerufen, die unter

eingerichtet ist, wenn von den privaten zur öffentlichen Zweig verschmelzenden ich in der Regel git merge --squash private tun . Auf diese Weise werden private Bearbeitungen nicht in die öffentliche GIT-Geschichte eindringen.

.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 

, wenn es einen Weg, dies bitte zu verbessern Kommentar

Antwort

14

Um auf der sicheren Seite zu sein, können Sie eine git attribute (siehe here for an example) für diese privaten Dateien hinzufügen.

Auf diese Weise können Sie ein Skript (einen "merge manager") definieren, das sicherstellt, dass die Datei einschließlich privater Informationen leer bleibt (oder mit öffentlichem Inhalt), wenn sie in der öffentlichen Verzweigung zusammengeführt wird mit der Privatfiliale verschmolzen.
Es bedeutet, dass Sie zusammenführen können, ohne an diese Datei zu denken.

+0

das funktioniert, danke! – Evgeny

+1

Dies funktioniert nur, wenn die Datei in beiden Zweigen geändert wird. Sobald die Zusammenführung mit keepmine aufgelöst wurde, wird die folgende Zusammenführung in der anderen Verzweigung durch recurse aufgelöst. – f3r3nc

2

halten Passwörter unter Versionskontrolle ist die schlechteste Idee überhaupt. Sie benötigen CVS, nicht git, um mit separaten Dateien zu arbeiten. Git wie viele andere moderne DVCS arbeitet mit dem gesamten Baum, nicht mit separaten Dateien.

+0

sicher, aber das Passwort ist der untergeordnete Punkt hier. – Evgeny

3

Ein Weg, dies zu tun ist mit git rebase. Indem Sie Ihre privaten Änderungen als ein paar Commits am Ende Ihrer master festhalten, können Sie öffentliche Dateien an die master-Verzweigung (oder was auch immer Sie Ihre Arbeitsfiliale wählen) festschreiben und dann Ihre private Zweigstelle gegen den Master rebasen, wann immer Sie aktualisieren möchten .

Eine andere Möglichkeit, dies zu handhaben, besteht darin, Vorlagenkonfigurationsdateien in Git zu behalten, z. B. frobozz.config.template. Kopieren Sie in Ihrem Arbeitsverzeichnis frobozz.config.template in die (unversionierte) frobozz.config und ändern Sie sie. Stellen Sie sicher, dass Sie auch Ihr Arbeitsverzeichnis sichern, wenn Ihre lokalen Änderungen gesichert werden müssen.

3

Dies funktioniert nur, wenn Übereinstimmungskonflikte erkannt werden. Durch das Hin- und Herverknüpfen zwischen Zweigen wird die Datei überschrieben. Es sei denn, ich habe etwas falsch gemacht. Natürlich ist dies in Windows msysgit git Version 1.6.5.1.1367.

+0

@yoyodyn Ja, das stimmt, das funktioniert nur bei Dateien mit Merge-Konflikten. – Evgeny

+0

können Sie auch nur einen Weg von öffentlich zu privat in Betracht ziehen, aber in diesem Fall müssen Sie diszipliniert bleiben - entwickeln Sie nur öffentliche Funktionen auf dem öffentlichen Zweig/Repository – Evgeny

+0

Was ich tatsächlich habe, ist drei Klone des gleichen Repo an verschiedenen geographischen Standorten. Unser Büro arbeitet in der Hauptniederlassung, eine andere Seite arbeitet in der Testniederlassung, so dass der Kunde QA machen kann, und die dritte ist der Produktionszweig, in dem sich der aktuell laufende Code befindet. Wir haben mindestens eine Datei Macros.h, die wir in viele C++ - Projekte aufnehmen, die unterschiedliche Werte für die Makros enthalten, abhängig davon, ob es sich um Master, Test oder Produktion handelt. Ich habe versucht, einen Weg zu finden, um zu verhindern, dass die Datei macros.h zwischen Zweigen zusammengeführt wird. – yoyodyn