Pendant de nombreuses années, j'ai fait $HOME
vérifier tout mon répertoire en subversion. Cela inclut tous mes fichiers de points et profils d’applications, de nombreux scripts, outils et hacks, la structure de mon répertoire personnel de base préféré, ainsi que quelques projets inhabituels et un entrepôt de données aléatoires. C'était une bonne chose. Tant que ça a duré.
Mais c'est devenu incontrôlable. La vérification de base est la même sur des dizaines de systèmes, mais tout ce matériel n’est pas adapté à toutes mes machines. Il ne joue même pas bien avec différentes distributions.
Je suis en train de nettoyer la maison - séparer les données de leur lieu d'origine, séparer certains scripts en projets distincts, réparer des liens brisés dans des éléments devant être automatisés, etc.
Mon intention est de remplacer subversion
par git
pour la vérification au plus haut niveau de $HOME
, mais j'aimerais réduire cela à tout ce que je voudrais avoir sur TOUS mes systèmes, à savoir les fichiers de points, quelques répertoires et quelques scripts personnalisés de base.
En lisant en ligne, beaucoup de gens semblent le faire en utilisant l’approche des liens symboliques: cloner dans un sous-répertoire, puis créer des liens symboliques à partir $HOME
du référentiel. Ayant eu le $HOME
contrôle total de ma version pendant plus de 10 ans, je n’aime pas l’idée de cette approche et je ne comprends pas pourquoi les gens semblent si opposés à la méthode de paiement direct. Y a-t-il des pièges dont je devrais avoir connaissance en git
tant que commande de niveau supérieur pour $HOME
?
Post-scriptum En partie comme un exercice de bonne codage, je prévois aussi de rendre publique ma vérification de racine sur github. Il est effrayant de constater la quantité d’informations confidentielles relatives à la sécurité que j’ai permis de collecter dans des fichiers pouvant être partagés sans hésiter! Mot de passe WiFi, clés RSA non passphrasées, etc. Eeek!
la source
git
modifie les autorisations de vos fichiers644
après l'expiration, ce qui est préjudiciable pour des éléments tels que les clés ssh privées. Cependant,etckeeper
c'est une solution pour utiliser git avec des permissions pour / etc /.zshrc
,.vimrc
et les choses semblables sans avoir à les aseptiser d' abord!Réponses:
Oui , il existe au moins un écueil majeur lorsqu’on envisage
git
de gérer un répertoire personnel qui ne pose pas de problèmesubversion
.Git est à la fois gourmand et récursif par défaut .
Subversion ignorera naïvement tout ce qu’il ne sait pas et arrête de traiter les dossiers vers le haut ou le bas de votre caisse quand il atteint un dossier qu’il ne connaît pas (ou qui appartient à un autre référentiel). Git, quant à lui, continue à récurer dans tous les répertoires enfants, rendant les extractions imbriquées très compliquées en raison de problèmes d'espace de nommage. Etant donné que votre répertoire personnel est probablement également le lieu où vous passez à la caisse et que vous travaillez sur divers autres référentiels git, le fait d’avoir votre répertoire personnel dans git risque de vous rendre la vie impossible.
En fin de compte, c’est la principale raison pour laquelle les utilisateurs extraient leurs fichiers .NET dans un dossier isolé, puis un lien symbolique vers ce dernier. Cela empêche la manipulation lorsque vous faites autre chose dans n'importe quel répertoire enfant de votre
$HOME
. Bien que ce soit purement une question de préférence si vous voulez que votre maison soit subversion, cela devient une nécessité si vous utilisez git.Cependant , il existe une solution alternative. Git autorise quelque chose appelée "fausse racine" où toute la machinerie du référentiel est cachée dans un autre dossier pouvant être physiquement séparé du répertoire de travail d'extraction. Le résultat est que le toolkit git ne sera pas dérouté: il ne verra même pas votre référentiel, seulement la copie de travail. En définissant quelques variables d'environnement, vous pouvez indiquer à git où trouver les marchandises pour ces moments où vous gérez votre répertoire personnel. Sans les variables d'environnement définies, personne n'est le plus sage et votre maison a l'apparence d'un fichier classique.
Pour rendre cette astuce un peu plus fluide, il existe d'excellents outils. La liste de diffusion vcs-home semble être l’endroit idéal pour commencer, et la page à propos contient un récapitulatif pratique des howtos et des expériences des utilisateurs. Tout au long du chemin, vous trouverez quelques petits outils astucieux comme vcsh , mr . Si vous souhaitez conserver votre répertoire personnel directement dans git, vcsh est presque un outil indispensable. Si vous divisez votre répertoire personnel en plusieurs répertoires en coulisse, associez-le
vcsh
àmr
un moyen rapide et pas très sale de gérer tout cela en même temps.la source
git add -f <file>
.git
outils continueraient à considérer que vous travaillez sur votre repo de répertoire local même si vous vous trouviez dans un sous-répertoire qui était un référentiel git distinct pour un projet. Cette solution rendrait votre répertoire personnel entier hors de portée de tout autre travail git./*
fonctionne mieux que*
parce qu'il ignore toujours tout par défaut mais rend beaucoup plus facile l'ajout de répertoires. Au lieu d’git add -f
utiliser des!
modèles -prefixés tels que!/.vimrc
et!/.gitignore
(pour le fichier .gitignore lui-même) pour inclure explicitement des éléments dans le référentiel.Je ne voudrais pas que tout mon répertoire personnel soit enregistré dans le contrôle de version simplement parce que cela signifie que tous les sous-répertoires dans lesquels je vais avoir ont le contexte de contrôle de version de mon répertoire personnel. Des commandes comme, par exemple,
git checkout
auraient une action réelle dans ce cas, posant des problèmes si j'exécute accidentellement quelque chose à partir du mauvais répertoire, qu'il s'agisse de quelque chose engit
soi ou d'un script qui appelle git.Cela rend également plus probable l'ajout de quelque chose que vous ne voulez pas dans le rapport, ce qui n'aurait pas été un problème si vous aviez tout enregistré, mais qui devient maintenant un problème. Que faire si vous ajoutez accidentellement un fichier de clé privée (peut-être par habitude) et le poussez vers github?
Cela dit, j’estime que les principaux inconvénients ne sont pas vraiment techniques - je veux juste me sauver de moi-même.
En ce qui concerne les liens symboliques: vous pouvez cloner votre rapport dans un sous-répertoire et créer un script qui met à jour tous les liens symboliques devant être mis à jour. La quantité de maintenance requise pour ce script peut compenser les avantages de l'avoir du tout, cependant; symlinking pourrait s'avérer être moins de travail.
Avec les liens symboliques, vous pouvez également facilement ajouter des ajouts spécifiques à la distribution (ou même à l’hôte) qui sont archivés dans git. Votre script symlink-update ignorera les fichiers destinés à des plates-formes incompatibles ou à des hôtes différents et ne mettra à jour que ceux appropriés.
Quelque chose comme:
Personnellement: j'utilise des liens symboliques et je ne répertorie pas de liens symboliques; seuls les fichiers à l'intérieur. Cela me donne une certaine souplesse pour apporter des modifications locales à ces répertoires (par exemple, ajouter / supprimer des fichiers). Configurer mon compte sur un nouveau système est fastidieux car je dois recréer tous les liens symboliques à la main.
la source
git
commandes que je lance s’appliqueraient soit au répertoire de base lui-même, soit seraient enterrées au moins dans un répertoire situé dans un répertoire non validé. L'utilisation desvn
cette isolation de dossier est très efficace et ne m'a posé aucun problème depuis une décennie. Votre premier paragraphe indique autre chose. Est-ce vraiment une différence dans la façon dontgit
fonctionne?git
en termes de gestion des branches. Encore quelque chose me manque ou est-ce que cela va tomber par préférence?git
- vous en êtes sûrsvn
- mais, à titre d'exemple,git init foo && mkdir -p foo/bar/baz/spam && cd foo/bar/baz/spam && git status
(ou d'autres commandes git), vous indiquez que vous êtes toujours dansfoo
le contexte du contrôle de version.$HOME
- et le versionnage n'a pas vraiment de valeur pour dotfiles imo - mais c'est finalement votre répertoire personnel, donc si vous préférez utiliser git et que ce ne sont pas des problèmes pour vous, fonce!Pour donner un autre point de vue: j'ai mon $ HOME sous git depuis quelque temps maintenant et je n’ai trouvé aucun inconvénient. Je ne synchronise évidemment pas ce git repo sur github; J'utilise un service qui a des pensions privées. De plus, je ne mets aucun fichier multimédia, téléchargement ou package sous le contrôle de Git.
git status
est une sorte de liste de contrôle "à faire, à nettoyer".J'ai un
~/tmp
pour les choses temporaires, qui est gitignored.J'aime voir dans
git status
tout ce qu'un logiciel récemment installé ose ajouter à mon $ HOME, et supprime souvent ces fichiers, voire même désinstaller les coupables.J'ajoute manuellement les fichiers et répertoires locaux vraiment utiles
.gitignore
, qui présentent l'avantage de "savoir ce que vous faites lors de l'installation".Si je construis une nouvelle VM ou installe un nouveau PC, je clone simplement ma maison distante sur $ HOME et j'ai immédiatement tout ce dont j'ai besoin sous la main.
Des choses comme vundle for vim plugins ne sont plus nécessaires.
Je n'aime pas la complexité. Lorsque je modifie un fichier rcf, je le fais, engage et pousse. Ensuite, par réflexe, j’ai tiré dans $ HOME tous les deux jours et j’ai toujours la dernière configuration. C'est aussi simple que ça.
Machines actuellement soumises à ce régime: ordinateur portable à la maison, ordinateur de travail, machine virtuelle de travail, plus 3 ou 4 serveurs distants.
la source
git init --bare
sur ssh (bien que je ne mette pas de mots de passe dans le référentiel, mes fichiers de notes s'y trouvent).J'ai essayé les deux et j'ai préféré l' approche des liens symboliques à la fin:
make install
Désavantages:
Avantages:
.gitignore
(j'ai 133 fichiers de points dans~
mon humble boîte Ubuntu)~
éléments liés (tels queMakefile
etcleanup.sh
) à l'écartRestrictions
~
. Cela simplifie la création de liens symboliques et rend facile la détection de nouveaux fichiers, par exemple~/.vim
, au prix de très rares.gitignore
travaux de maintenance.Les deux derniers avantages ont fait pencher la balance dans mon cas - je ne veux pas encombrer le répertoire personnel, et je veux que le contenu privé et le contenu public soient clairement séparés.
La seule application que je connaisse qui ait (ou du moins eu) des problèmes de gestion des liens symboliques est Pidgin - Elle écrase continuellement mes liens symboliques avec des fichiers ordinaires.
la source
En voici une: si vous essayez de le faire
git rebase -i --root
et que vous avez archivé.gitconfig
le premier commit dans le référentiel, git supprimera temporairement le.gitconfig
fichier, ce qui l'empêchera de terminer l'opération de rebasement car il nécessite votre nom et votre adresse email. cela, qui sont stockés dans ce fichier.Vous pouvez les configurer à nouveau
git rebase --continue
, mais après l'avoir fait et terminé l'opération de rebase, mon dépôt git avait obtenu une validation vide sans message de validation avant la validation qui était auparavant la première validation dans le référentiel, ce que je ne connais pas. comment se débarrasser de.Je ne sais pas ce qui se passe si vous le faites à la
git rebase -i <commit>
place, et.gitconfig
est enregistré avec tout commit ultérieur<commit>
.La solution la plus simple est peut-être de s’abstenir d’ajouter
.gitconfig
des données au référentiel et de les lister.gitignore
.la source
Voici comment je le fais:
git init
chez toi*.cache
,*.lock
etc. Je ne recommande pas d'ajouter/*
parce que vous ne serez pas averti automatiquement quand quelque chose de nouveau est ajouté à votre maison. C’est une approche de liste noire par opposition à une liste blanche, où je veux fondamentalement conserver ma configuration pour tous les logiciels, à l’exception des éléments volatiles et de certains logiciels qui ne me dérangent pas. Lorsque vous fusionnez, migrez ou comparez des systèmes ultérieurement, il est très pratique de tout différencier. Vous pouvez configurer vos nouveaux systèmes beaucoup plus rapidement que si vous aviez simplement .bashrc et quelques autres fichiers. De cette façon, vous conserverez la configuration que vous auriez peut-être définie par le biais de l'interface graphique et vous ne saurez pas quels fichiers dot stockent les paramètres. (S'il s'avère que vous avez déjà commis des fichiers volatiles, vous pouvez toujours dire à git d'assumer-inchangé)etckeeper init -d /home/username
git commit -d /home/username
homekeeper checkout
Etckeeper est utilisé pour stocker des métadonnées, comme des autorisations sur vos fichiers (plutôt important pour certaines choses comme les clés ssh). Vous devriez maintenant avoir un crochet de pré-validation qui enregistrera automatiquement les métadonnées. Je ne suis pas si sûr de post-checkout. Vous devriez probablement utiliser
etckeeper checkout xxx -d /home/user
Je vais examiner un peu plus et élaborer cette réponse.la source
Mon problème majeur avec l'utilisation de Git sur le répertoire de base est que Git ne stocke pas les attributs de fichiers tels que les autorisations de fichiers et les horodatages. Pour moi, il est important de savoir quand certains fichiers ont été créés, cela peut ou peut ne pas être le cas pour vous. En outre, la perte d'autorisations sur des fichiers et des répertoires
.ssh
est problématique. Je comprends que vous envisagez de.ssh
ne pas utiliser Git, mais il y aura d’autres endroits où les autorisations pourraient avoir de l’importance (comme les sauvegardes de sites Web non compressées).la source
.ssh
certain temps que je me tiens au courant sans problème, les autorisations sécurisées appropriées sont préservées. Ce qu’il ne fait pas dans la configuration de base, c’est de conserver la propriété ou les horodatages; Cependant, si l'un de ces problèmes pose problème pour un cas d'utilisation spécifique, certains plug-ins peuvent intégrer la gestion de ces propriétés supplémentaires au flux de travaux standard (voir metastore ou git-cache-meta).Une solution basée sur git est particulièrement utile si vous devez déployer vos fichiers sur différentes machines, et encore plus si vous avez des parties communes à toutes les machines et des parties spécifiques à certaines machines. Vous pouvez créer plusieurs référentiels et utiliser un outil tel que multigit ou vcsh pour les cloner dans le même répertoire (votre répertoire personnel dans ce cas).
la source