Close

Pliki .dot: najlepszy sposób na przechowywanie w podstawowym repozytorium Git

Zastrzeżenie: tytuł jest nieco przesadzony — istnieją również inne sprawdzone rozwiązania problemu. Myślę jednak, że poniższa technika jest bardzo elegancka.

Niedawno dowiedziałem się o pewnej świetniej technice w wątku w witrynie Hacker News na temat rozwiązań dotyczących przechowywania plików .dot. Użytkownik StreakyCobra pokazał swoją elegancką konfigurację i... to było genialne! Jestem w trakcie przejścia na tę technikę z własnego systemu. Jedynym warunkiem wstępnym jest zainstalowanie Git.

Tak określił wymagania swojej techniki:

brak dodatkowych narzędzi, brak łączy symbolicznych, pliki są śledzone w systemie kontroli wersji i można używać różnych gałęzi na różnych komputerach, a także replikować konfigurację w nowej instalacji.

Ta technika polega na przechowywaniu podstawowego repozytorium Git w folderze „pomocniczym” (na przykład $HOME/.cfg lub $HOME/.myconfig) przy użyciu specjalnie przygotowanego aliasu, aby polecenia były uruchamiane w tym repozytorium, a nie w zwykłym folderze lokalnym .git, co zakłóciłoby działanie innych repozytoriów Git.


Od zera


Jeśli wcześniej nie śledzono konfiguracji w repozytorium Git, możesz z łatwością zacząć używać tej techniki za pomocą następujących poleceń:

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
  • Pierwsze polecenie tworzy folder ~/.cfg, który jest podstawowym repozytorium Git, w którym będą śledzone pliki.
  • Następnie tworzymy alias config, którego użyjemy zamiast zwykłego polecenia git, gdy będziemy wchodzić w interakcje z naszym repozytorium konfiguracji.
  • Ustawiamy lokalne dla repozytorium oznaczenie, aby ukryć pliki, których jeszcze jawnie nie śledzimy. Dzięki temu po wpisaniu polecenia config status i innych poleceń pliki, które nie są istotne, nie będą wyświetlane jako nieśledzone.
  • Możesz również dodać definicję aliasu ręcznie do pliku .bashrc albo użyć dodanego dla ułatwienia czwartego wiersza.

Spakowałem powyższe polecenia jako fragment kodu w Bitbucket i dodałem do niego łącze za pomocą krótkiego adresu URL. Dzięki temu możliwa jest poniższa konfiguracja:

Bazy danych
materiały pokrewne

Jak przenieść pełne repozytorium Git

Logo Bitbucket
POZNAJ ROZWIĄZANIE

Poznaj środowisko Git z rozwiązaniem Bitbucket Cloud

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

Po wykonaniu konfiguracji każdy plik w folderze $HOME może być objęty kontrolą wersji przy użyciu zwykłych poleceń z Git zastąpionym nowo utworzonym aliasem config, na przykład:

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

Instalacja plików .dot w nowym systemie (lub migracja do tej konfiguracji)


Jeśli przechowujesz już konfigurację / pliki .dot w repozytorium Git, możesz zmigrować tę konfigurację do nowego systemu, wykonując następujące czynności:

  • Przed instalacją upewnij się, że alias został zatwierdzony w pliku .bashrc lub .zsh:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Upewnij się też, że repozytorium źródłowe ignoruje folder, do którego sklonujesz konfigurację, aby uniknąć dziwnych problemów z rekursją:
echo ".cfg" >> .gitignore
  • Teraz sklonuj pliki .dot do podstawowego repozytorium w folderze „kropka” w swoim katalogu $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Zdefiniuj alias w bieżącym zakresie powłoki:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Wyewidencjonuj rzeczywistą zawartość z podstawowego repozytorium do katalogu $HOME:
config checkout
  • Powyższy krok może zakończyć się niepowodzeniem z komunikatem:
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

Dzieje się tak, ponieważ Twój folder $HOME może już zawierać standardowe pliki konfiguracyjne, które zostałyby zastąpione przez Git. Rozwiązanie jest proste: utwórz kopię zapasową plików, jeśli Ci na nich zależy — w przeciwnym razie usuń je. Oto skrót do automatycznego przenoszenia wszystkich plików, które mogą powodować problemy, do folderu kopii zapasowej:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
  • Jeśli wystąpiły problemy, uruchom ponownie operację wyewidencjonowania:
config checkout
  • W celu oznaczenia showUntrackedFiles ustaw wartość no w tym konkretnym (lokalnym) repozytorium:
config config --local status.showUntrackedFiles no
  • Gotowe. Od teraz możesz wpisywać polecenia config, aby dodawać i aktualizować pliki .dot:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Aby mieć możliwość skorzystania z kolejnego skrótu i nie musieć pamiętać wszystkich tych kroków na każdym nowym komputerze, który chcesz skonfigurować, możesz utworzyć prosty skrypt, zapisać go jako fragment kodu Bitbucket, tak jak ja, utworzyć dla niego krótki adres URL i wywoływać go w ten sposób:

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

Oto całe końcowe rozwiązanie (testowane na wielu nowych kontenerach Alpine Linux):

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

Podsumowanie


Mam nadzieję, że ta technika śledzenia konfiguracji okaże się przydatna. Jeśli Cię to interesuje, moje pliki .dot przechowuję tutaj. Bądź na bieżąco, obserwując @durdn lub mój niesamowity zespół @atlassiandev.


Udostępnij ten artykuł

Zalecane lektury

Dodaj te zasoby do zakładek, aby dowiedzieć się więcej na temat rodzajów zespołów DevOps lub otrzymywać aktualności na temat metodyki DevOps w Atlassian.

Ludzie współpracujący przy ścianie pełnej narzędzi

Blog Bitbucket

Ilustracja DevOps

Ścieżka szkoleniowa DevOps

Demonstracje funkcji z ekspertami Atlassian

Zobacz, jak Bitbucket Cloud współpracuje z Atlassian Open DevOps

Zapisz się do newslettera DevOps

Thank you for signing up