Wie kann man "Punktedateien" unter Versionskontrolle halten?


30

Etckeeper ist ein großartiges Tool, um Änderungen an Ihren Konfigurationsdateien in zu verfolgen /etc. Ein paar wichtige Dinge sind wirklich bemerkenswert. Es kann mit einer Vielzahl von VCSs verwendet werden: Git, Mercurial, Darcs oder bzr. Es führt auch tägliche automatische Festschreibungen durch und wann immer Sie ein Paket installieren, entfernen oder aktualisieren. Außerdem werden Dateiberechtigungen und Metadaten zu Benutzer- / Gruppenbesitz erfasst.

Ich möchte auch meine "Punktedateien" in meinem Home-Verzeichnis unter Versionskontrolle halten, vorzugsweise Basar. Weiß jemand, ob es für diesen Zweck ein Tool wie Etckeeper gibt?

Im schlimmsten Fall, ich stelle ich vor , dass ein einfacher Cron - Job läuft bzr add && bzr cieinmal oder zweimal täglich zusammen mit Zugabe ~/Documents, ~/Musicusw. zu dem .bzrignore jemandem schon etwas zu tun , ähnlich mit einem Skript?

Während ich Basar vorziehen würde, könnten andere Optionen interessant sein.


4
Verwandte Diskussion bei Unix Stack Exchange: Tipps zum Versetzen von ~ unter Versionskontrolle . Es beantwortet Ihre Frage nicht, kann aber dennoch nützliche Informationen liefern.
Gilles 'SO- hör auf böse zu sein'

1
Dafür gibt es jetzt viele Tools. Siehe dotfiles.github.io im Abschnitt "Allgemeine Dotfile-Dienstprogramme".
Robin Green

@RobinGreen Wenn du das zu einer richtigen Antwort gemacht hast, könnte ich das akzeptieren. bzrist sicherlich nicht der
richtige

Antworten:


7

Ich wusste nicht, ob es irgendetwas gab, das dies tat, also habe ich Code zusammengestellt, um genau das zu erreichen, was Sie wollen, indem ich mein Repository hier verwende: http://github.com/robertmassaioli/config-files

Ich habe eine Datei, die sagt, wo alle Dateien hingehören und das generate_links-Programm legt sie einfach alle dort ab. Wenn Sie wissen, was Sie tun, und Haskell-Code kompilieren können, ist dies wirklich einfach und unkompliziert. Seien Sie jedoch gewarnt, dass es wirklich für meinen persönlichen Gebrauch gemacht wurde.


3
+1 für haskell! -1 für haskel! lol. nein aber wirklich.
Derek

Ich höre dich. Ich habe mich für Haskell entschieden, weil ich es lerne, es ist möglicherweise die beste Sprache für den Job oder nicht. :)
Robert Massaioli

3

Nun, ich habe das manuell gemacht, bis ich eine bessere Lösung gefunden habe. Ich könnte also genauso gut erklären, was ich getan habe.

Zuerst habe ich eine gemacht bzr init ~, aber das nächste was ich gemacht habe war bzr ignore "*". Ich entschied, dass ich nicht alles unter Versionskontrolle halten wollte. Es hat sich einfach nicht gelohnt, besonders wenn man bedenkt, dass es einige Dinge gibt, die man wirklich nicht in vcs wie seinen Schlüsseln behalten sollte. Also musste ich dann auf bzr adddie spezifischen Dateien, die ich wollte. Sie können auch Ausnahmen hinzufügen .bzrignore. Auch hier sind reguläre Python-Ausdrücke nützlich. Ich halte es für jetzt ziemlich schlank. Wenn alles gut geht, könnte ich alle hinzufügen ~/.configund ~/.gconfzu.

Ich habe auch ein schnelles Skript geschrieben, das ich als Cron-Job ausführe. Es wird geprüft, ob sich die Dateien geändert haben, und wenn ja, wird ein automatisches Festschreiben durchgeführt:

#! /bin/bash

set -e

TIME=$(date)
STATUS=$(bzr status)

if [ -n "$STATUS" ]; then
    if [ -n "$1" ]; then
         bzr ci ~ -m "$1"
    else
        bzr ci ~ -m "Automatic commit on $TIME"
    fi
fi

exit

Ich hatte meine eigene Antwort ausgewählt, als ich dies zum ersten Mal gepostet habe, aber beschlossen, dies rückgängig zu machen. Es ist sicherlich nicht die beste Antwort auf diese Frage im Jahr 2015.
andrewsomething

2

Ich habe mein gesamtes ~Verzeichnis in ein Basar-Repository verwandelt . Das Speichern von Metadaten ist für Dateien im Basisverzeichnis kein Problem: Alle Dateien gehören demselben Konto und derselben Gruppe und bzrspeichern bereits das Ausführungsbit.

Ich füge die "interessanten" Dateien manuell hinzu (ich möchte nicht, dass zB meine Musiksammlung oder der Firefox-Cache unter Versionskontrolle stehen), aber wenn Sie dies mit einem Skript automatisieren möchten, halte ich es für die einfache Lösung von Bei bzr add && bzr ciausgewählten Verzeichnissen oder bei der Ausgabe eines findBefehls wird nur der Job ausgeführt.


2

Ich behalte meine zsh- und vim-Dateien in git, put on github und in verschiedenen Repositories:

für zsh habe ich beispielsweise ".zsh" erstellt und darin zshrc und zshenv sowie ein Skript zum Verknüpfen von zshrc mit ~ / .zshrc und zshenv mit ~ / .zshenv eingefügt.

while true
do
read -p "do you want to link zshenv to ~/.zshenv (Y/N)" yn
case $yn in
    [Yy]*) ln -s ~/.zsh/zshenv ~/.zshenv; break;;
    [Nn]*) break;;
    *) echo "please answer yes or no";;
esac
done

while true
do
read -p "do you want to link zshrc to ~/.zshrc (Y/N)" yn
case $yn in
    [Yy]*) ln -s ~/.zsh/zshrc ~/.zshrc; break;;
    [Nn]*) break;;
    *) echo "please answer yes or no";;
esac
done

So ich mache

git clone git://git@github.com:tshirtman/.zsh
cd .zsh
./init.sh

Für .vim ist es fast dasselbe, außer dass ich Submodule für Plugins mit Pathogen verwende, also habe ich das in der init.sh hinzugefügt

git submodule init
git submodule update

und wenn ich ein Vim-Plugin hinzufügen möchte, tue ich

git submodule add git://github.com/nathanaelkane/vim-indent-guides.git bundle/vim-indent-guides

beispielsweise.

ok, es würde ein bisschen zu viel Arbeit erfordern, wenn Sie mehr als ein paar Punktverzeichnisse haben, die Sie verwalten möchten, aber nichts hindert Sie daran, sie alle in dasselbe Verzeichnis zu setzen oder nach Aktivitäten zu trennen (für alle grafischen Editoren ein für) Webaktivitäten ...) oder so. Jedenfalls habe ich das getan, also nur meine zwei Cent :).


1

Ich verwende eine Lösung, die nicht automatisch ist wie Etckeeper (ich muss manuell festschreiben), aber es hat gut für mich funktioniert. Es ist nicht ganz so entwickelt, wie ich es mag, aber es funktioniert.

Ich habe mein eigenes Hilfsprogramm geschrieben, das GNU Stow ähnelt , da stow nicht alles getan hat, was ich wollte. Ich nenne es Stow in Home . Wenn es ausgeführt wird, sucht es nach einem Verzeichnis mit dem Namen "HOME". Dann nimmt es alles unter diesem Verzeichnis und verknüpft es mit dem entsprechenden Speicherort in $ HOME, wobei es nach Bedarf Verzeichnisse erstellt. Es werden auch Dateinamen übersetzt - wenn eine Datei mit einem '_' beginnt, wird sie durch ein '.' Ersetzt. Ich habe dies getan, weil es besser ist, meine Punktedateien zu bearbeiten, wenn sie nicht ausgeblendet sind (standardmäßig werden sie in Verzeichnislisten angezeigt). Dann würde es sie in den Namen setzen, den ihre Anwendung erwartet.

Ich habe also mehrere Git-Repositories für meine Konfiguration. Ich füge nur Punktedateien hinzu, die ich persönlich bearbeite. Dies hat den Vorteil, dass ich ein Repository für Punktedateien haben kann, das ich mit anderen teilen kann (wie z. B. meine Emacs-Konfiguration) und eines für andere, die privat sind (z. B. meine ssh-Konfiguration, mit Hostnamen und dergleichen für die Arbeit). Die Verknüpfung mit Stow-in-Home bringt alles an den richtigen Ort, aber die Quellcodeverwaltung für jedes kann separat sein.

Es hat gut für mich funktioniert. Es gibt wirklich keinen Grund, warum ich nicht festlegen konnte, dass Commits automatisch ausgeführt werden. Oder verschieben Sie alle Punktedateien in die entsprechenden Repositorys und verwenden Sie weiterhin die Funktion zum Verstauen zu Hause. Aber so habe ich es gemacht.



0

Ich habe alle meine Dotfiles, die ich unter Versionskontrolle behalten möchte, in einen Ordner namens "dotfiles" in meinem / home / -Verzeichnis kopiert. Dies bedeutet natürlich, dass Duplikate aufbewahrt und bei Bedarf hin und her kopiert werden, aber ich finde, dass dies die einfachste Lösung für mich ist.


1
Können Sie nicht einfach Symlinks zu Ihren Punktedateien erstellen, anstatt Duplikate verwalten zu müssen?
Ryan

Ich denke, dass Sie zweifellos können!
Derek

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.