Ich möchte mein Home-Verzeichnis (~) der Quellcodeverwaltung unterwerfen (in diesem Fall git), da sich dort viele Einstellungsdateien (.gitconfig, .gitignore, .emacs usw.) befinden, die ich maschinenübergreifend übertragen möchte. und sie in Git zu haben, würde es schön machen, sie abzurufen.
Mein Hauptrechner ist mein MacBook, und wie OS X eingerichtet ist, gibt es viele Ordner, die ich ignorieren möchte (Dokumente, Downloads, .ssh). Es gibt auch Ordner, die Git (.emacs.d) bereits verwenden.
Mein Gedanke war, einfach alle diese Verzeichnisse zu meiner .gitignore-Datei hinzuzufügen, aber das scheint etwas lästig zu sein und könnte möglicherweise zu unvorhergesehenen Konsequenzen führen. Mein nächster Gedanke war, die Dateien, die ich speichern möchte, in regelmäßigen Abständen in einen Ordner zu Hause zu kopieren und diesen Ordner dann festzuschreiben. Das Problem dabei wird sein, dass ich daran denken muss, sie vor dem Festschreiben zu verschieben.
Gibt es eine saubere Möglichkeit, dies zu tun?
quelle
Antworten:
Ich habe
$HOME
unter git Die erste Zeile meiner .gitignore-Datei lautetDer Rest sind Muster, die mit dem
!
Modifikator nicht ignoriert werden dürfen . Diese erste Zeile bedeutet, dass standardmäßig alle Dateien in meinem Ausgangsverzeichnis ignoriert werden. Die Dateien, in die ich die Versionskontrolle durchführen möchte, lauten.gitignore
wie folgt:Ein schwierigeres Muster ist:
Das heißt, ich möchte nur
.ssh/config
versionieren - ich möchte nicht, dass meine Schlüssel und andere Dateien in .ssh in git aufgenommen werden. Das Obige ist, wie ich das erreiche.Bearbeiten: Schrägstriche am Anfang aller Pfade hinzugefügt. Dies bewirkt, dass die Ignoriermuster vom oberen Rand des Repositorys ($ HOME) anstatt von einer beliebigen Stelle aus übereinstimmen. Wenn es sich beispielsweise
!lib/
um ein Muster handelte (ignorieren Sie nicht alles im lib-Verzeichnis) und Sie fügen eine Datei hinzu.gitignore
, stimmte das Muster (!.gitignore
) zuvor mit dieser überein. Mit dem führenden Schrägstrich (!/.gitignore
) wird es nur.gitignore
in meinem Ausgangsverzeichnis und nicht in irgendwelchen Unterverzeichnissen übereinstimmen .Ich habe noch keinen Fall gesehen, in dem dies einen praktischen Unterschied zu meiner Ignorierliste darstellt, aber es scheint mir technisch korrekter zu sein.
quelle
Was ich (mit den gleichen Zielen) tue, ist, meine Konfigurationsdateien in ein Unterverzeichnis zu legen
~/lib
und symbolische Links in meinem Home-Verzeichnis zu haben, z.emacs -> lib/emacs/dot.emacs
. Ich behalte nur Konfigurationsdateien, die ich explizit geschrieben habe, unter Versionskontrolle. Mein Ausgangsverzeichnis enthält viele automatisch erstellte Punktedateien, die nicht der Versionskontrolle unterliegen. Somit~/lib
ist unter Versionskontrolle, und mein Home-Verzeichnis ist nicht.Ich habe ein Skript, das die symbolischen Links aus den Dateien unter erstellt
~/lib
. Wenn ich ein Konto auf einem neuen Computer erstelle, fülle ich es auf, indem ich~/lib
dieses Skript auschecke und ausführe .Meine Erfahrung ist mit CVS, nicht Git, also ist es nicht 100% übertragbar. Einer der Gründe, warum ich
~/.cvsignore
mein Homeverzeichnis nicht direkt unter CVS gestellt habe, ist, dass dies für alle meine CVS-Prüfungen gilt und nicht nur für mein Homeverzeichnis. Git hat dieses Problem nicht. Der Nachteil dieses Ansatzes gegenüber der Versionskontrolle des Basisverzeichnisses besteht darin, dass Sie nichtgit status
zwischen einer Datei, die Sie explizit ignorieren möchten (die in der Ignorierdatei aufgeführt und daher nicht angezeigt wird) und einer Datei unterscheiden können Datei, zu der Sie keine Meinung haben (die mit einem angezeigt würde?
).Einige Dateien müssen auf verschiedenen Computern unterschiedlich sein. Ich lege sie in ein Verzeichnis mit dem Namen
~/Local/SITENAME/lib
und erstelle entweder symbolische Links für sie oder (für Dateiformate, die dies unterstützen) habe eine include-Direktive in der Datei unter~/lib
. Ich habe auch einen symbolischen Link~/Here -> ~/Local/SITENAME
. Da git im Gegensatz zu CVS zumeist ähnliche, aber nicht identische Repositorys unterstützt, gibt es möglicherweise eine bessere Möglichkeit, maschinenspezifische Dateien zu verwalten. Einige meiner Punktedateien sind in der Tat keine symbolischen Links, sondern werden automatisch aus Inhalten unter~/lib
und generiert~/Here
.quelle
~/.gitignore
. Ohne eine solche Konfiguration wird die Datei nicht auf ein Repository angewendet, außer auf eines, in dem~/.git
sie gespeichert ist (selbst dann würde sie nicht auf Unter-Repositorys angewendet werden ). Ich verwende core.excludesfile =~/.git-user-excludes
, um den Konflikt zwischen den Ausschlüssen zu vermeiden, die auf alle meine Git-Repositorys angewendet werden sollen (unabhängig vom Speicherort), und den Ausschlüssen, die auf das Repository angewendet werden sollen, das (Teile von) meines Ausgangsverzeichnisses enthält.gitignore
Manpage falsch verstanden : „Muster, die aus einer .gitignore-Datei im selben Verzeichnis wie der Pfad oder in einem beliebigen übergeordneten Verzeichnis gelesen wurden (…) das verzeichnis.git
ist)?.gitignore
Dateien nach oben ist an die Wurzel des Arbeitsbaums gebunden. Der Satz, den Sie zitiert haben, lautet weiter: „(bis zur obersten Ebene des Arbeitsbaums)“.Wir können Gits Fähigkeit nutzen, um Dateien weiter zu verfolgen, selbst wenn sie in aufgelistet sind
.gitignore
. Das reicht also für.gitignore
:Führen Sie für jede Datei, die Sie verfolgen möchten, Folgendes aus
add -f
(der-f
Parameter überschreibt das Ignorieren von sowohl in.gitignore
als auch.git/info/exclude
):Sobald eine Datei indiziert wurde, verfolgt Git alle Änderungen, obwohl die Datei ignoriert wird. Dasselbe gilt für ein Verzeichnis, jedoch nur für die Dateien, die tatsächlich vorhanden sind:
Wenn Sie ein ganzes Verzeichnis mit allen darin enthaltenen neuen Dateien nachverfolgen möchten , kann dies
.gitignore
auf eine Weise ausgeschlossen werden, die in der Antwort von camh beschrieben ist :Wenn Sie jemals die Verfolgung einer Datei beenden möchten, wird mit diesem Befehl eine Datei aus dem Index von Git entfernt, sie bleibt jedoch auf der Festplatte erhalten:
quelle
Ich benutze das Alte
rcs
dafür.Werfen Sie einen Blick auf Manpages
ci
,co
undrcs
. Diese Seiten sollten auch hilfreich sein:Ich benutze das für die Versionskontrolle meiner Punktedateien, zum Beispiel:
Und wenn ich sie bearbeiten möchte:
Ich empfehle, ein Verzeichnis mit dem Namen
RCS
in Ihrem zu~
erstellen. Sie können dieses Verzeichnis dann problemlos irgendwo sichern.quelle
Ich checke meine Konfigurationsdateien
$HOME/.conf/
aus einem BitBucket Mercurial-Repository aus. Ein GitHub-Repo würde genauso gut funktionieren.Der
~/.conf
Checkout enthält Konfigurationsdateien und ein Shell-Skript, mit dem Symlinks in$HOME
jede Datei in gefüllt werden können~/.conf
. Für Konfigurationsformate , die Inklusion unterstützen (.bashrc
,.inputrc
,.vimrc
, etc.) Ich schließe die~/.conf
Datei anstatt Verbindung zu ihm, damit ich lokale Überschreibungen tun.Bei einigen Konfigurationsdateien verweise ich auf eine Datei in meinem Dropbox-Ordner und teile sie über die Dropbox.
Einige Monate lang habe ich versucht, mich
$HOME
selbst in der Versionskontrolle zu halten, aber ich hatte es satt, die umfangreichen Ignorierlisten zu verwalten, Konfigurationsänderungen einzuchecken, die durch das Ausführen von Apps vorgenommen wurden, und das Ergebnis war nicht einmal etwas, das ich auf einem anderen Computer auschecken wollte. Können Sie sich vorstellen, Konflikte über~/.gconf
oder zu~/.config/monitors.xml
lösen oder für unterschiedliche Versionen von Desktop-Apps zu sorgen?Ich finde es einfacher, Symlinks zu erstellen oder eine begrenzte Liste von Konfigurationsdateien einzuschließen, die ich persönlich angepasst habe und die ich als globale Standardeinstellungen für mehrere Computer freigeben möchte.
quelle
Ich habe gerade angefangen, das folgende Python Dotfiles-Skript zu verwenden, ein praktisches Tool, mit dem die Dateien automatisch verknüpft werden: https://pypi.python.org/pypi/dotfiles
quelle
Ich denke, Ihre zweite Vermutung, nicht verwandte Ordner unter Quellcodeverwaltung zu haben, ist gut.
Fügen Sie dort einfach 2 Shell-Skripte hinzu. Eine, um Dateien unter Ihrer Kontrolle zu kopieren,
~
und die andere, um Dateien zu sammeln~
und sie zurück in den Quellcodeverwaltungsordner zu kopieren und zu bestätigen.quelle
Hier ist ein kleines Ruby-Skript, mit dem ich eine neue Maschine einrichte
quelle