Tipps, um ~ der Quellcodeverwaltung zu unterstellen

77

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?

Dan McClain
quelle
Sie können auch ein Skript erstellen, das die Commits der gewünschten Ordner ausführt und es über Cronjobs aufruft.
Shadok
Beachten Sie, dass das Standard-HFS + -Dateisystem unter Mac OS X die Groß- und Kleinschreibung nicht berücksichtigt (aber die Groß- und Kleinschreibung beibehält) und die Dateipfade in kanonisch zerlegtem UTF-8 im Benutzerbereich codiert sind! Weitere Informationen finden Sie unter: <a href=" stackoverflow.com/questions/5581857/… und das Umlaut-Problem unter Mac OS X</a>

Antworten:

60

Ich habe $HOMEunter git Die erste Zeile meiner .gitignore-Datei lautet

/*

Der 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 .gitignorewie folgt:

!/.gitignore
!/.profile
[...]

Ein schwierigeres Muster ist:

!/.ssh
/.ssh/*
!/.ssh/config

Das heißt, ich möchte nur .ssh/configversionieren - 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 .gitignorein 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.

camh
quelle
1
Mir scheint, dass dasselbe auf viel einfachere Weise erreicht werden kann .
Nick Volynkin
24

Was ich (mit den gleichen Zielen) tue, ist, meine Konfigurationsdateien in ein Unterverzeichnis zu legen ~/libund 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 ~/libist 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 ~/libdieses Skript auschecke und ausführe .

Meine Erfahrung ist mit CVS, nicht Git, also ist es nicht 100% übertragbar. Einer der Gründe, warum ich ~/.cvsignoremein 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 nicht git statuszwischen 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/libund 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 ~/libund generiert ~/Here.

Gilles
quelle
Vielleicht haben Sie core.excludesfile = ~/.gitignore. Ohne eine solche Konfiguration wird die Datei nicht auf ein Repository angewendet, außer auf eines, in dem ~/.gitsie 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.
Chris Johnsen
@ Chris: Ich weiß extrem wenig über Git. Möglicherweise habe ich diesen Satz in der gitignoreManpage falsch verstanden : „Muster, die aus einer .gitignore-Datei im selben Verzeichnis wie der Pfad oder in einem beliebigen übergeordneten Verzeichnis gelesen wurden (…) das verzeichnis .gitist)?
Gilles
1
Ja, die Suche nach .gitignoreDateien nach oben ist an die Wurzel des Arbeitsbaums gebunden. Der Satz, den Sie zitiert haben, lautet weiter: „(bis zur obersten Ebene des Arbeitsbaums)“.
Chris Johnsen
@ Chris: Meine Version der Manpage enthält diese Wörter nicht - es sieht so aus, als ob der Wortlaut geklärt wurde. Ich habe meine Antwort korrigiert. Vielen Dank!
Gilles
Dies wurde kürzlich im Chat besprochen
strugee
11

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:

$ cat .gitignore
/*

Führen Sie für jede Datei, die Sie verfolgen möchten, Folgendes aus add -f(der -fParameter überschreibt das Ignorieren von sowohl in .gitignoreals auch .git/info/exclude):

git add -f .gitignore
git add -f .profile
git add -f .zshrc
git add -f .ssh/config

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:

git add -f somedirname

Wenn Sie ein ganzes Verzeichnis mit allen darin enthaltenen neuen Dateien nachverfolgen möchten , kann dies .gitignoreauf eine Weise ausgeschlossen werden, die in der Antwort von camh beschrieben ist :

!/somedirname

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:

git rm --cached .ssh/config
Nick Volynkin
quelle
1
Ich würde dir meine Punkte geben, wenn ich könnte. Beachten Sie, dass diese Methode nur zum Verfolgen von Dateien und nicht von Verzeichnissen verwendet werden kann. Wenn Sie möchten, dass git alle Dateien in einem Verzeichnis verfolgt, müssen Sie dieses Verzeichnis in .gitignore weiterhin ignorieren. Andernfalls werden neue Dateien in diesem Verzeichnis nicht als neue Dateien angezeigt.
15.
5

Ich benutze das Alte rcsdafür.

Werfen Sie einen Blick auf Manpages ci, cound rcs. Diese Seiten sollten auch hilfreich sein:

Ich benutze das für die Versionskontrolle meiner Punktedateien, zum Beispiel:

ci -u .*vimrc

Und wenn ich sie bearbeiten möchte:

co -l .*vimrc

Ich empfehle, ein Verzeichnis mit dem Namen RCSin Ihrem zu ~erstellen. Sie können dieses Verzeichnis dann problemlos irgendwo sichern.

Polemon
quelle
2
rcs ist jetzt ziemlich veraltet und git macht alles, was rcs macht und noch viel mehr. Früher habe ich rcs für alle lokalen Anwendungen verwendet, bei denen ich nicht den Overhead haben wollte, ein Repository auf einem Server einzurichten, aber jetzt bin ich für diese Art der Verwendung vollständig auf git umgestiegen. Ich habe sogar ein Skript geschrieben, das cvs2git umschließt, um eine vorhandene Verzeichnishierarchie mit darin enthaltenen rcs-Dateien in git umzuwandeln.
Neil Mayhew
1
Ja, ich weiß, dass es veraltet ist. Die Frage war nach einem Tipp, wie man das macht. Ich habe diesem Typen gerade erzählt, wie ich es seit vielen, vielen Jahren mache ("datiert", Hinweis, Hinweis). Es war nicht so gemeint, dass es der einzig vernünftige Weg ist, es zu tun.
Polemon
5

Ich checke meine Konfigurationsdateien $HOME/.conf/aus einem BitBucket Mercurial-Repository aus. Ein GitHub-Repo würde genauso gut funktionieren.

Der ~/.confCheckout enthält Konfigurationsdateien und ein Shell-Skript, mit dem Symlinks in $HOMEjede Datei in gefüllt werden können ~/.conf. Für Konfigurationsformate , die Inklusion unterstützen ( .bashrc, .inputrc, .vimrc, etc.) Ich schließe die ~/.confDatei 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 $HOMEselbst 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 ~/.gconfoder zu ~/.config/monitors.xmllö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.

Graham
quelle
3

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

trojjer
quelle
1

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.

Alexander Pogrebnyak
quelle
0

Hier ist ein kleines Ruby-Skript, mit dem ich eine neue Maschine einrichte

#!/usr/bin/env ruby
# setup.rb

#list of dirs which you don't want to symlink
ignored = %w(.gitignore .gitmodules misc setup.rb readme)

current_dir = File.expand_path(Dir.pwd)
home_dir = File.expand_path("~")

links = `git ls-tree --name-only HEAD`.lines.map(&:strip).select {|x| !ignored.include?(x)  }

links.each do |link|
  link = File.join(current_dir, link)
  symlink = File.join(home_dir, File.basename(link))
  `ln -ns #{link} #{symlink}`
end
Khaja Minhajuddin
quelle