Close

Dotfiles: de beste manier om op te slaan in een bare Git-repository

Disclaimer: De titel is enigszins hyperbolisch; er zijn andere bewezen oplossingen voor het probleem. Ik vind de onderstaande techniek wel erg elegant.

Onlangs las ik over deze geweldige techniek in een thread van Hacker News over de oplossingen van mensen om hun dotfiles op te slaan. Gebruiker Streaky Cobra liet zijn elegante opstelling zien en ... die was zo logisch! Ik ben bezig mijn eigen systeem over te schakelen naar dezelfde techniek. Je moet er alleen Git voor installeren.

In zijn woorden vereist de onderstaande techniek:

Geen extra tools, geen symbolische links; bestanden worden bijgehouden op een versiebeheersysteem, je kunt verschillende branches gebruiken voor verschillende computers, je kunt je configuratie eenvoudig repliceren bij een nieuwe installatie.

De techniek bestaat erin om een bare Git-repository op te slaan in een 'zijmap' (zoals $HOME/.cfg of $Home/.myConfig) met een speciaal samengestelde alias, zodat opdrachten worden uitgevoerd op die repository en niet op de gebruikelijke lokale .git-map, die alle andere Git-repository's in de buurt zou verstoren.


Beginnen met een nieuw project


Als je je configuraties nog niet eerder in een Git-repository hebt bijgehouden, kun je deze techniek eenvoudig gaan gebruiken met de volgende regels:

git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
  • De eerste regel maakt een map ~/.cfg. Deze is een 'bare' Git-repository waarin onze bestanden worden bijgehouden;
  • Vervolgens maken we een aliasconfiguratie die we zullen gebruiken in plaats van de gewone git als we willen communiceren met onze configuratie-repository;
  • We hebben een markering geplaatst (lokaal in de repository) om bestanden te verbergen die we nog niet expliciet traceren. Zo worden bestanden die je niet wilt traceren niet als untracked weergegeven wanneer je later config status en andere opdrachten typt;
  • Je kunt ook de definitie van de alias handmatig toevoegen aan je .bashrc of voor het gemak de vierde regel gebruiken die is meegeleverd.

Ik heb de bovenstaande regels verpakt in een snippet op Bitbucket en ze gekoppeld via een korte URL. Daardoor kun je alles instellen met behulp van:

Databases
gerelateerd materiaal

Een volledige Git-repository verplaatsen

Logo Bitbucket
Oplossing bekijken

Git leren met Bitbucket Cloud

curl -Lks http://bit.do/cfg-init | /bin/bash

Nadat je de installatie hebt uitgevoerd, kan er van elk bestand in de map $HOME een versie met normale opdrachten worden gemaakt, die git vervangt door je nieuw aangemaakte config-alias, zoals:

config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Installeer je dotfiles op een nieuw systeem (of migreer naar deze installatie)


Als je je configuration/dotfiles al in een Git-repository hebt opgeslagen, kun je in een nieuw systeem naar deze configuratie migreren door de volgende stappen uit te voeren:

  • Zorg ervoor dat je vóór de installatie de alias aan je .bashrc of .zsh hebt gekoppeld:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • En dat je bron-repository de map waarnaar je kloont negeert, zodat je geen rare recursieproblemen veroorzaakt:
echo ".cfg" >> .gitignore
  • Kloon nu je dotfiles naar een bare repository in een 'dotfiles'-map in je $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Definieer de alias in het huidige shell-bereik:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Check de actuele inhoud uit de bare repository uit naar je $HOME:
config checkout
  • Bovenstaande stap kan mislukken met een bericht als:
error: The following untracked working tree files would be overwritten by checkout:
    .bashrc
    .gitignore
Please move or remove them before you can switch branches.
Aborting

Dit komt omdat je $HOME-map mogelijk al een aantal standaardconfiguratiebestanden bevat die door Git zouden worden overschreven. De oplossing is eenvoudig: maak een back-up van de bestanden als je om ze geeft of verwijder ze als het je niets kan schelen. Ik geef je een mogelijke snelle manier om alle vervelende bestanden automatisch naar een reservemap te verplaatsen:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
  • Voer de check-out opnieuw uit als je problemen ondervond:
config checkout
  • Stel de markering ShowUntrackedFiles in op no in deze specifieke (lokale) repository:
config config --local status.showUntrackedFiles no
  • Je bent klaar. Vanaf nu kun je config-opdrachten typen om je dotfiles toe te voegen en bij te werken:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Nogmaals: om niet al deze stappen te hoeven onthouden op een nieuwe machine die je wilt installeren, kun je een eenvoudig script maken, het opslaan als Bitbucket-snippet, zoals ik deed, er een korte URL voor maken en het als volgt aanroepen:

curl -Lks http://bit.do/cfg-install | /bin/bash

Voor de volledigheid: dit was mijn resultaat (getest op veel nieuwe Alpine Linux-containers om het uit te testen):

git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
   /usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if [ $? = 0 ]; then
  echo "Checked out config.";
  else
    echo "Backing up pre-existing dot files.";
    config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

Samenvattend ...


Ik hoop dat je deze techniek nuttig vindt om je configuratie te volgen. Mocht je nieuwsgierig zijn: mijn dotfiles staan hier. Blijf ook in contact door @durdn of mijn geweldige team @atlassiandev te volgen.


Deel dit artikel
Volgend onderwerp

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Mensen die samenwerken met een muur vol tools

Bitbucket-blog

Toelichting DevOps

DevOps-leertraject

Demo Den Feature-demo's met Atlassian-experts

Hoe Bitbucket Cloud werkt met Atlassian Open DevOps

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up