web-dev-qa-db-fra.com

Conseils pour mettre ~ sous contrôle source

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?

78
Dan McClain

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.

60
camh

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
11
Nick Volynkin

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.

5
Graham

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.

5
polemon

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

3
trojjer

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.

1

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
0
Khaja Minhajuddin