Przez wiele lat cały mój $HOME
katalog był sprawdzany jako subversion. Obejmuje to wszystkie moje pliki dot i profile aplikacji, wiele skryptów, narzędzi i hacków, moją preferowaną podstawową strukturę katalogu domowego, a nie kilka dziwnych projektów i losowe dane o wartości hurtowej. To była dobra rzecz. Podczas gdy to trwało.
Ale wymknęło się spod kontroli. Podstawowa kasa jest taka sama dla kilkudziesięciu systemów, ale nie wszystkie rzeczy są odpowiednie dla wszystkich moich komputerów. To nie wszystko dobrze gra z różnymi dystrybucjami.
Jestem w trakcie sprzątania domu - oddzielanie danych tam, gdzie należy, rozdzielanie niektórych skryptów jako osobnych projektów, naprawianie uszkodzonych linków w rzeczach, które powinny zostać zautomatyzowane itp.
Moim zamiarem jest, aby wymienić subversion
z git
na kasie, będąc w głównym z $HOME
, ale chciałbym pare to w dół po prostu rzeczy, chciałbym mieć na wszystkich moich systemów, co oznacza dotfiles, kilka katalogów i niektóre podstawowe skrypty.
Podczas czytania online wiele osób robi to przy użyciu metody dowiązań symbolicznych: klonuj do podkatalogu, a następnie twórz dowiązania symboliczne z $HOME
repozytorium. Mając $HOME
pełną kontrolę nad wersją przez ponad dekadę, nie podoba mi się to podejście i nie mogę zrozumieć, dlaczego ludzie wydają się tak niechętni prostej metodzie kasowania. Czy są jakieś pułapki, o których muszę wiedzieć, git
jako konkretne dla kasy najwyższego poziomu $HOME
?
PS Częściowo, jako ćwiczenie z dobrego kodowania, planuję również upublicznić moje konto roota na github. Przerażające jest to, jak wiele poufnych informacji, które pozwoliłem zebrać w plikach, które można podzielić bez zastanowienia! Hasło Wi-Fi, niepasujące klucze RSA itp. Eeek!
źródło
git
zmieni uprawnienia do plików na644
kasę, co jest niekorzystne dla takich rzeczy jak prywatne klucze ssh.etckeeper
jest jednak rozwiązanie do używania git z uprawnieniami do / etc /.zshrc
,.vimrc
i podobne rzeczy bez konieczności zdezynfekować je pierwszy!Odpowiedzi:
Tak , istnieje co najmniej jeden poważny problem przy rozważaniu
git
zarządzania katalogiem domowym, który nie stanowi problemusubversion
.Git jest domyślnie zarówno chciwy, jak i rekurencyjny .
Subversion naiwnie zignoruje wszystko, o czym nie wie i przestanie przetwarzać foldery w górę lub w dół od kasy, gdy dotrze do takiego, o którym nie wie (lub który należy do innego repozytorium). Z drugiej strony Git ciągle się rekursuje we wszystkich katalogach potomnych, co sprawia, że zagnieżdżone kasy są bardzo skomplikowane z powodu problemów z przestrzenią nazw. Ponieważ twój katalog domowy jest prawdopodobnie miejscem, w którym kasujesz i pracujesz nad różnymi innymi repozytoriami git, posiadanie twojego katalogu domowego w git prawie na pewno sprawi, że twoje życie stanie się niemożliwym bałaganem.
Jak się okazuje, jest to główny powód, dla którego ludzie pobierają swoje pliki dot do osobnego folderu, a następnie umieszczają w nim dowiązanie symboliczne. Uniemożliwia gitowi wykonywanie innych czynności w dowolnym katalogu podrzędnym
$HOME
. Chociaż jest to wyłącznie kwestia preferencji, jeśli sprawdzasz swój dom w subwersji, staje się kwestią konieczności, jeśli używasz git.Istnieje jednak alternatywne rozwiązanie. Git pozwala na coś, co nazywa się „fałszywym rootem”, w którym cała maszyneria repozytorium jest ukryta w alternatywnym folderze, który można fizycznie oddzielić od katalogu roboczego kasy. W rezultacie zestaw narzędzi git się nie pomyli: nawet NIE ZOBACZ repozytorium, tylko kopia robocza. Ustawiając kilka zmiennych środowiskowych, możesz wskazać git, gdzie znaleźć towary na te chwile, kiedy zarządzasz katalogiem domowym. Bez ustawionych zmiennych środowiskowych nikt nie jest mądrzejszy, a Twój dom wygląda jak klasyczna własność pliku.
Aby sprawić, by ta sztuczka płynęła trochę płynniej, istnieje kilka świetnych narzędzi. Lista dyskusyjna VCS-dom wydaje się de facto miejsce, aby rozpocząć, a o stronie posiada wygodny omotać z HOWTO i doświadczeń ludzi. Po drodze są jakieś fajne małe narzędzia, takie jak vcsh , mr . Jeśli chcesz przechowywać katalog domowy bezpośrednio w git, vcsh jest prawie niezbędnym narzędziem. Jeśli w końcu podzielisz swój katalog domowy na kilka repozytoriów za kulisami, połącz go
vcsh
z,mr
aby uzyskać szybki i niezbyt brudny sposób zarządzania nim jednocześnie.źródło
git add -f <file>
.git
narzędzia nadal uważają, że pracujesz nad swoim domowym repozytorium, nawet jeśli byłeś w jakimś podkatalogu, który był oddzielnym repozytorium git dla jakiegoś projektu. Takie rozwiązanie spowodowałoby, że cały katalog domowy nie byłby ograniczony do wszystkich innych operacji git./*
działa lepiej niż*
dlatego, że nadal domyślnie ignoruje wszystko, ale znacznie ułatwia dodawanie katalogów. Zamiastgit add -f
używać!
wzorców z prefiksem, takich jak!/.vimrc
i!/.gitignore
(dla samego pliku .gitignore ), aby jawnie uwzględniać rzeczy w repozytorium.Nie chciałbym, aby cały mój katalog domowy był sprawdzany pod kontrolą wersji po prostu dlatego, że oznacza to, że każdy podkatalog, do którego wchodzę, miałby kontekst kontroli wersji mojego katalogu domowego. Polecenia takie
git checkout
miałyby w takim przypadku rzeczywiste działanie, powodując problemy, jeśli przypadkowo uruchomię coś z niewłaściwego katalogu, niezależnie od tego, czy jest to coś innegogit
, czy skrypt wywołujący git.Zwiększa także prawdopodobieństwo dodania do repozytorium czegoś, czego nie chcesz, co nie byłoby problemem, gdy wszystko się zameldowałeś, ale teraz staje się problemem. Co jeśli przypadkowo dodasz plik klucza prywatnego (być może z przyzwyczajenia) i wypchniesz go do github?
Powiedziawszy to, uważam, że główne wady nie są tak naprawdę techniczne - po prostu chcą mnie uratować od siebie.
Co do symlinkowania: możesz sklonować swoje repozytorium do podkatalogu i mieć skrypt, który aktualizuje wszelkie dowiązania symboliczne, które wymagają aktualizacji. Jednak ilość konserwacji wymaganej dla tego skryptu może przeważać nad korzyściami z posiadania go; dowiązanie symboliczne może okazać się mniej pracy.
Za pomocą dowiązań symbolicznych możesz także łatwo dodawać specyficzne dla dystrybucji (lub nawet hosta) dodatki, które są sprawdzane w git. Twój skrypt aktualizacji dowiązań symbolicznych zignoruje pliki przeznaczone dla niezgodnych platform lub różnych hostów i zaktualizuje tylko te odpowiednie.
Coś jak:
Osobiście: Używam dowiązań symbolicznych i nie symbolizuję katalogów dowiązań; tylko pliki wewnątrz. Daje mi to pewną elastyczność w dokonywaniu lokalnych zmian w tych katalogach (np. Dodawanie / usuwanie plików). Założenie mojego konta w nowym systemie jest żmudne, ponieważ muszę ręcznie odtworzyć wszystkie dowiązania symboliczne.
źródło
git
polecenia, które uruchamiam, byłyby albo dla samego katalogu domowego, albo byłyby zakopane co najmniej jedno głęboko w katalogu niezaangażowanym. Korzystanie zsvn
tej izolacji jednego folderu jest dość skuteczne i nie sprawiło mi żadnych problemów przez dekadę. Twój pierwszy akapit wskazuje coś innego. Czy to rzeczywiście różnica w sposobiegit
działania?git
do łatwych w zarządzaniu gałęzi. Ciągle czegoś mi brakuje, czy sprowadzi się to do preferencji?git
- nie jestem pewiensvn
- ale na przykładgit init foo && mkdir -p foo/bar/baz/spam && cd foo/bar/baz/spam && git status
(lub inne polecenia git) pokazują, że nadal jesteś wfoo
kontekście kontroli wersji.$HOME
- a wersjonowanie nie jest tak naprawdę cenne dla plików doto - imo - ale ostatecznie jest to twój katalog domowy, więc jeśli wolisz używać git i nie są to dla ciebie problemy, idź po to!Żeby dać inny punkt widzenia: od jakiegoś czasu mam $ GITta i nie znalazłem żadnych wad. Oczywiście nie synchronizuję tego repozytorium git z github; Korzystam z usługi, która ma prywatne repozytorium. Nie poddaję również żadnych plików multimedialnych, plików do pobrania ani pakietów kontrolom git.
git status
jest rodzajem listy kontrolnej „robić, czyścić”.Mam
~/tmp
tymczasowe rzeczy, które są gitignored.Lubię widzieć we
git status
wszystkim, co ostatnio zainstalowane oprogramowanie odważy się dodać do mojego $ HOME, i często usuwam te pliki, a nawet odinstalowuję winowajców.Dodaję ręcznie bardzo przydatne lokalne pliki i katalogi
.gitignore
, które mają zaletę „wiesz, co robisz podczas instalowania rzeczy”.Jeśli zbuduję nową maszynę wirtualną lub zainstaluję nowy komputer, po prostu sklonuję mój zdalny dom do $ HOME i od razu mam wszystko, czego potrzebuję.
Rzeczy takie jak vundle dla wtyczek vim nie są już potrzebne.
Nie lubię złożoności. Kiedy poprawiam dowolny plik rc, po prostu robię to, zatwierdzam i pcham. Następnie, odruchowo, ściągam $ HOME co drugi dzień i zawsze mam najnowszą konfigurację. To takie proste.
Komputery obecnie objęte tym schematem: laptop domowy, komputer stacjonarny, maszyna wirtualna oraz 3 lub 4 zdalne serwery.
źródło
git init --bare
które przerzucam na ssh (chociaż nie umieszczam haseł w repozytorium, mam tam swoje pliki notatek).Próbowałem obu i na końcu wolałem podejście do dowiązania symbolicznego :
make install
Niedogodności:
Zalety:
.gitignore
(mam 133 pliki dot~
na moim skromnym pudełku Ubuntu)~
powiązane rzeczy (takie jakMakefile
icleanup.sh
) na uboczuOgraniczenia:
~
. Dzięki temu symlinkowanie jest proste i sprawia, że zauważenie na przykład nowych plików jest trywialne~/.vim
, kosztem bardzo rzadkiej.gitignore
konserwacji.Te dwie ostatnie zalety przewróciły wagę w moim przypadku - nie chcę zaśmiecać katalogu domowego i chcę wyraźnie oddzielić prywatne i publiczne treści.
Jedyną znaną mi aplikacją, która ma (lub przynajmniej miała) problemy z obsługą dowiązań symbolicznych, był Pidgin - Nadpisywał moje dowiązania symboliczne zwykłymi plikami.
źródło
Oto jedna: jeśli spróbujesz to zrobić
git rebase -i --root
i zalogowałeś się.gitconfig
przy pierwszym zatwierdzeniu w repozytorium, git tymczasowo usunie.gitconfig
plik, co z kolei uniemożliwi wykonanie operacji zmiany bazy, ponieważ wymaga do tego twojego imienia i adresu e-mail które są przechowywane w tym pliku.Możesz je skonfigurować ponownie i zrobić to ponownie
git rebase --continue
, ale po tym , jak to zrobiłem i zakończyłem operację bazowania, moje repozytorium git zyskało puste zatwierdzenie bez komunikatu zatwierdzenia przed zatwierdzeniem, które było wcześniej pierwszym zatwierdzeniem w repozytorium, którego nie znam jak się pozbyć.Nie wiem, co się stanie, jeśli to zrobisz
git rebase -i <commit>
, i.gitconfig
jest rejestrowane wraz z każdym zatwierdzeniem po<commit>
.Być może najłatwiejszym rozwiązaniem jest powstrzymanie się od dodawania
.gitconfig
do repozytorium i wpisanie go.gitignore
.źródło
Tak to robię:
git init
w swoim domu*.cache
,*.lock
itd. I nie polecam dodanie/*
ponieważ nie będziesz automatycznie powiadamiany o dodaniu czegoś nowego do domu. Jest to podejście oparte na czarnej liście w porównaniu do białej listy, w której zasadniczo chcę zachować moją konfigurację dla wszystkich programów oprócz niestabilnych rzeczy i niektórych programów, na których mi nie zależy. Kiedy później scalisz, migrujesz lub porównujesz systemy, możliwość różnicowania wszystkiego jest całkiem przydatna. Możesz skonfigurować nowe systemy znacznie szybciej niż gdybyś tylko miał .bashrc i kilka innych plików dot. W ten sposób zachowasz konfigurację, którą możesz ustawić za pomocą GUI i nie będziesz wiedział, które pliki dot przechują ustawienia. (Jeśli kiedykolwiek okaże się, że popełniłeś niestabilne pliki, nadal możesz powiedzieć gitowi, aby zakładał niezmienione)etckeeper init -d /home/username
git commit -d /home/username
homekeeper checkout
Powodem użycia etckeepera jest to, że będzie on przechowywał metadane, takie jak uprawnienia do plików (raczej ważne dla niektórych rzeczy, takich jak klucze ssh). Powinieneś teraz mieć przechwytywanie przed zatwierdzeniem, które automatycznie zapisuje metadane. Nie jestem pewien co do realizacji transakcji po zakończeniu transakcji. Prawdopodobnie powinieneś użyć
etckeeper checkout xxx -d /home/user
, przyjrzę się temu nieco więcej i opracuję tę odpowiedź.źródło
Mój główny problem z używaniem Git w katalogu domowym polega na tym, że Git nie przechowuje atrybutów plików, takich jak uprawnienia do plików i znaczniki czasu. Dla mnie ważne jest, aby wiedzieć, kiedy zostały utworzone określone pliki, co może, ale nie musi, dotyczyć Ciebie. Ponadto utrata uprawnień do plików i katalogów, taka jak
.ssh
jest problematyczna. Rozumiem, że planujesz trzymać.ssh
się z dala od Gita, ale będą inne miejsca, w których uprawnienia mogą mieć znaczenie (takie jak nieskompresowane kopie zapasowe witryn).źródło
.ssh
jakiegoś czasu trzymam git bez problemu, odpowiednie bezpieczne uprawnienia są zachowane. To, czego nie robi w konfiguracji podstawowej, to zachowanie własności lub znaczników czasu; jednak jeśli którykolwiek z nich stanowi problem w konkretnym przypadku użycia, istnieją wtyczki, które mogą uczynić obsługę tych dodatkowych właściwości częścią zwykłego przepływu pracy (zobacz metastore lub git-cache-meta).Rozwiązanie oparte na git jest szczególnie przydatne, jeśli chcesz wdrożyć pliki na różnych komputerach, a tym bardziej, jeśli masz części wspólne dla wszystkich komputerów i części specyficzne dla niektórych komputerów. Możesz utworzyć wiele repozytoriów i użyć narzędzia takiego jak multigit lub vcsh, aby sklonować je w tym samym katalogu (w tym przypadku katalog domowy).
źródło