Je veux mettre mon annuaire de domicile (~) sous contrôle source (GIT, dans ce cas), car j'ai de nombreux fichiers de paramétrage (.gitconfig, .gitignore, .emacs, etc.) là, je voudrais porter des machines, et les avoir dans Git ferait de la sorte pour les récupérer.
Ma machine principale est mon MacBook, et la façon dont OS X est installée, il y a beaucoup de dossiers que je veux ignorer (documents, téléchargements, .ssh). Il existe également des dossiers qui utilisent déjà GIT (.emacs.d).
Ma pensée consistait à ajouter tous ces répertoires à mon fichier .gitignore, mais cela semble gentille de ficelle et pourrait potentiellement conduire à des conséquences imprévues. Ma prochaine pensée était de copier périodiquement les fichiers que je veux stocker dans un dossier à la maison, puis commettez ce dossier. Le problème avec ce sera que je dois me rappeler de les déplacer avant de vous engager.
Y a-t-il un moyen propre de faire cela?
J'ai $HOME
sous git. La première ligne de mon fichier .gitignore est
/*
Les autres sont des motifs pour ne pas ignorer en utilisant le !
modificateur. Cette première ligne signifie que la valeur par défaut est d'ignorer tous les fichiers de mon répertoire personnel. Ces fichiers que je veux contrôler la version, entrez dans .gitignore
comme ça:
!/.gitignore
!/.profile
[...]
Un modèle plus délicat que j'ai est:
!/.ssh
/.ssh/*
!/.ssh/config
C'est-à-dire que je veux seulement la version .ssh/config
- Je ne veux pas que mes clés et autres fichiers dans .ssh vont dans git. Ce qui précède, c'est comment je réalise cela.
EDIT: Ajout de Slashes au début de tous les chemins. Cela rend les motifs ignorés correspondent au sommet du référentiel ($ à la maison) au lieu de n'importe où. Par exemple, si !lib/
était un motif (ne pas tout ignorer dans le répertoire lib) et vous ajoutez un fichier .gitignore
, précédemment le modèle (!.gitignore
) correspondait à cela. Avec la barre oblique (!/.gitignore
), il ne correspondra que .gitignore
Dans mon répertoire à domicile et non dans des sous-répertoires.
Je n'ai pas vu de cas où cela fait une différence pratique avec ma liste d'ignore, mais cela me semble être plus précis techniquement.
Ce que je fais (avec les mêmes objectifs) est de mettre mes fichiers de configuration dans un sous-répertoire ~/lib
Et ont des liens symboliques dans mon répertoire, par exemple, .emacs -> lib/emacs/dot.emacs
. Je ne garde que les fichiers de configuration que j'ai écrit explicitement sous le contrôle de version; mon répertoire contient plently des fichiers de points créés automatiquement qui ne sont pas sous contrôle de version. Ainsi ~/lib
Est sous contrôle de version, et mon répertoire est pas.
J'ai un script qui crée les liens symboliques des fichiers sous ~/lib
. Lorsque je crée un compte sur une nouvelle machine, je le remplir en vérifiant ~/lib
Et l'exécution de ce script.
Mon expérience est avec CVS, pas git, il est donc pas à 100% transférable. L'une des raisons pour lesquelles je ne l'ai pas mis mon répertoire directement sous CVS est que ~/.cvsignore
S'appliquerait à tous mes CVS et pas seulement checkouts mon répertoire personnel; git n'a pas ce problème. L'inconvénient de cette approche par rapport à avoir le répertoire sous contrôle de version est que vous ne pouvez pas utiliser git status
Faire la distinction entre un fichier que vous avez explicitement décidé d'ignorer (qui serait répertorié dans le fichier ignorer, donc pas affiché) et un fichier que vous avez pas d'opinion à propos (qui serait affiché avec un ?
).
Certains fichiers doivent être différents sur des machines différentes. Je les ai mis dans un répertoire appelé ~/Local/SITENAME/lib
Et, soit créer des liens symboliques pour eux aussi bien ou (pour les formats de fichiers qui prennent en charge) ont une directive include dans le fichier sous ~/lib
. J'ai aussi un lien symbolique ~/Here -> ~/Local/SITENAME
. Depuis git, contrairement à CVS, est conçu pour supporter des dépôts essentiellement similaires-mais-pas identiques, il peut y avoir une meilleure façon de gérer les fichiers spécifiques à la machine. Certains de mes fichiers de points sont en fait des liens non symboliques, mais généré automatiquement à partir du contenu sous ~/lib
et ~/Here
.
Nous pouvons utiliser la capacité de GIT de continuer à suivre les fichiers même s'ils sont énumérés dans .gitignore
. Donc, cela suffit pour .gitignore
:
$ cat .gitignore
/*
Pour chaque fichier que vous souhaitez suivre, exécutez add -f
(les -f
PARAMETER NOUVELLES Ignorer les deux dans .gitignore
et .git/info/exclude
):
git add -f .gitignore
git add -f .profile
git add -f .zshrc
git add -f .ssh/config
Une fois avoir indexé un fichier, GIT suivra tous les changements malgré le fait que le fichier est ignoré. Les mêmes œuvres pour un répertoire, mais uniquement pour les fichiers qui sont réellement présents:
git add -f somedirname
Si vous souhaitez suivre un répertoire entier avec , tous les nouveaux fichiers qui apparaissent, il peut être exclu de .gitignore
D'une manière, décrite dans la Réponse de CAMH :
!/somedirname
Si vous souhaitez jamais cesser de suivre un fichier, ces commandes supprime un fichier de l'index de Git mais la laisse intacte sur le disque dur:
git rm --cached .ssh/config
Je consulte mes fichiers de configuration à $HOME/.conf/
À partir d'un référentiel Mercurial Bitbucket. Un repo github fonctionnerait aussi bien.
Les ~/.conf
Checkout contient des fichiers de configuration et un script shell pour peupler des liens symboliques dans $HOME
à chaque fichier dans ~/.conf
. Pour les formats de configuration qui supportent l'inclusion (.bashrc
, .inputrc
, .vimrc
, etc.) J'inclus le ~/.conf
Fichier plutôt que de le lier, de sorte que je puisse faire des dérogations locales.
Pour certains fichiers de configuration, je liens avec un fichier dans mon dossier Dropbox et partager via Dropbox.
Pendant quelques mois, j'ai essayé de garder $HOME
elle-même dans la version de la version, mais j'en ai marre de gérer les énormes listes d'ignorations, j'ai marre de vérifier les modifications de configuration effectuées en exécutant des applications et que le résultat n'était même pas quelque chose que je voudrais vérifier sur un autre ordinateur. Pouvez-vous imaginer la réparation de conflits sur ~/.gconf
ou ~/.config/monitors.xml
, ou la restauration des versions différentes des applications de bureau?
Je trouve plus facile à symboliser ou inclure une liste limitée de fichiers de configuration que j'ai personnellement personnalisés et que vous souhaitez partager sur des machines sous forme de défauts globaux.
J'utilise l'ancien rcs
pour cela.
Jetez un coup d'œil aux manquages pour ci
, co
et rcs
. Ces sites devraient également être utiles:
J'utilise cela pour la version contrôlant mes dotfiles par exemple:
ci -u .*vimrc
Et si je veux les éditer:
co -l .*vimrc
Je recommande de faire un répertoire nommé RCS
dans votre ~
, vous pouvez ensuite facilement sauvegarder ce répertoire quelque part.
Je viens de commencer à utiliser le fichier suivant Python Dotfiles Script, qui est un outil pratique qui relie automatiquement les fichiers pour vous: https://pypi.python.org/pypi.python./dotfiles
Je pense que votre deuxième hunch doit avoir un dossier non associé sous contrôle source est bon.
Il suffit d'ajouter 2 scripts shell là-bas. Un pour copier des fichiers sous votre contrôle sur ~
et l'autre pour collecter des fichiers de ~
et le copier dans le dossier à la source et commettez-le.
Voici un petit Ruby script que j'utilise pour configurer une nouvelle machine
#!/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