Mam niezwykły pomysł, aby użyć gita jako systemu zapasowego. Powiedzmy, że mam katalog ./backup/myfiles i chcę utworzyć jego kopię zapasową za pomocą git. Aby zachować porządek, nie chcę mieć katalogu .git w folderze myfiles, więc pomyślałem, że mogę utworzyć ./backup/git_repos/myfiles. Patrząc na dokumenty git, próbowałem zrobić to:
$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files
Możesz zobaczyć komunikat o błędzie, że tam dotarłem. Co ja robię źle?
Odpowiedzi:
Zrobi to, co chcesz, ale oczywiście będzie do niczego, jeśli będziesz musiał to określić przy każdym poleceniu git, którego kiedykolwiek użyjesz.
Możesz eksportować,
GIT_WORK_TREE=.
aGIT_DIR=../backup
Git odbierze je przy każdym poleceniu. Pozwoli to jednak wygodnie pracować tylko w jednym repozytorium na powłokę.Wolałbym raczej zasugerować dowiązanie symboliczne katalogu .git do innego miejsca lub utworzenie dowiązania symbolicznego do katalogu .git z głównego katalogu kopii zapasowej.
źródło
Musisz tylko upewnić się, że repozytorium wie, gdzie znajduje się drzewo robocze i odwrotnie.
Aby repozytorium wiedziało, gdzie znajduje się drzewo robocze, ustaw wartość konfiguracyjną
core.worktree
. Aby powiadomić drzewo robocze, gdzie jest katalog git, dodaj plik o nazwie .git (nie folder!) I dodaj linię taką jakOd wersji 1.7.5 git polecenie init nauczyło się dodatkowej opcji do tego.
Możesz zainicjować nowe oddzielne repozytorium za pomocą
Spowoduje to zainicjowanie repozytorium git w oddzielnym katalogu i dodanie pliku .git do bieżącego katalogu, który jest katalogiem roboczym nowego repozytorium.
Wcześniej w wersji 1.7.5 trzeba było używać nieco innych parametrów i samodzielnie dodawać plik .git.
Aby zainicjować oddzielne repozytorium, następujące polecenie łączy drzewo robocze z repozytorium:
Twój bieżący katalog będzie drzewem roboczym, a git użyje repozytorium pod adresem
/path/to/repo.git
. Polecenie init automatycznie ustawicore.worktree
wartość określoną w--git-dir
parametrze.Możesz nawet dodać do tego alias:
Użyj kontroli wersji git w katalogu roboczym tylko do odczytu
Mając powyższą wiedzę, możesz nawet skonfigurować kontrolę wersji git dla katalogu roboczego bez posiadania uprawnień do zapisu. Jeśli używasz
--git-dir
przy każdym poleceniu git lub wykonujesz każde polecenie z repozytorium (zamiast katalogu roboczego), możesz pominąć plik .git i dlatego nie musisz tworzyć żadnych plików w katalogu roboczym. Zobacz także odpowiedź Leosaźródło
core.worktree
jest oczywiście przechowywana w pliku konfiguracyjnym folderu .git, na który wskazuje plik .git.fatal: core.worktree and core.bare do not make sense
. Wygląda na to, że zmiana konfiguracji, aby nie była pusta, rozwiązuje ten problem.W mojej wersji git ( ) można to osiągnąć
--separate-git-dir
za pomocą opcjigit init
(i ). Opcja oddziela repozytorium git od drzewa roboczego i tworzy dowiązanie symboliczne git niezależne od systemu plików (w postaci pliku o nazwie ) w katalogu głównym drzewa roboczego. Myślę, że wynik jest identyczny z odpowiedzią ników .git clone
1.7.11.3
.git
źródło
init
Samo użycie opcji wiersza poleceń wygląda jaśniej i czyściejrepo.git
systemie Windows jest tworzony z ustawionym atrybutem Hiden. Następnie zmieniam go ręcznie. Czy wiesz, czy to jest bezpieczne?Uważam, że łatwiej jest odwrócić katalogi
--work-tree
i--git-dir
używane w odpowiedzi niksa:Takie podejście ma dwie zalety:
.git
plików wiersza poleceń . Po prostu działasz normalnie z poziomu katalogu głównego repozytorium.Jedynym zastrzeżeniem, jakie napotkałem, jest to, że zamiast używać
.gitignore
pliku, edytujeszinfo/exclude
.Możesz następnie używać repozytorium
read_only_repos/foo
jako zdalnego we własnych repozytoriach, nawet jeśli oryginalne pliki nie są pod kontrolą wersji.źródło
Zwykle nazywa się katalog będący repozytorium git, które ma swoje drzewo robocze w nietypowym miejscu z rozszerzeniem „.git”, podobnie jak zwykłe repozytorium.
Gdybyś podał tę
--work-tree
opcję w czasie inicjalizacji, to automatyczniecore.worktree
ustawiłoby to zmienną konfiguracyjną, co oznacza, że git będzie wiedział, gdzie znaleźć drzewo robocze po określeniu katalogu git.Ale możesz ustawić tę zmienną również po fakcie.
Gdy to zrobisz, polecenie add powinno działać zgodnie z oczekiwaniami.
źródło
Użyj
git
wewnątrz repozytorium:Od teraz możesz używać
git
wewnątrz./backup/git_repos/myfiles
katalogu, bez ustawiania jakichkolwiek zmiennych środowiskowych czy dodatkowych parametrów.źródło
warning: core.bare and core.worktree do not make sense
czy to oznacza, że nie zadziałało?core.bare
nafalse
później.Możesz stworzyć skrypt „nodgit” (bez kropki GIT) z czymś w rodzaju
Możesz wywołać nodgit zamiast git, który ustawi zmienne w razie potrzeby, szukając repozytorium git. Na przykład, powiedzmy, że masz (nagie) repozytorium w / usr / local / gits / __ home__foo_wibbles i jesteś w / home / foo / wibbles / one, wtedy znajdzie on właściwy katalog roboczy (/ home / foo / wibbles) i repozytorium .
Aha, możesz także użyć "powłoki nodgit", aby uzyskać powłokę z poprawnymi ustawionymi zmiennymi, dzięki czemu możesz używać zwykłych starych poleceń git.
źródło
Zakładając, że Twoje
myfiles
katalogi już istnieją i zawierają treści, czy możesz z tym żyć:.git
Katalog będziebackup
, niemyfiles
.źródło
git
śledzić za pomocą.gitignore
pliku. Jeśli dodasz*
i!myfiles
do niego, tylko ten katalog będzie śledzony. Ale jeśli chcesz osobne repozytorium dla innego katalogu, miałbyś problem ...Tworzę skrypty, które wyglądają
~ / bin / git-slash:
Używanie --git_dir = $ GIT_DIR jest zbędne, ale przypomina mi, że mogę ustawić zmienne środowiskowe również poza skryptem.
Powyższy przykład służy do śledzenia lokalnych zmian w plikach systemowych cygwin.
Potrafię stworzyć jeden taki skrypt dla każdego dużego projektu, który tego potrzebuje - ale / bez /.git jest moim głównym zastosowaniem.
Powyższe jest wystarczająco małe, aby utworzyć alias lub funkcję powłoki, jeśli wyeliminujesz nadmiarowość.
Gdybym robił to wystarczająco często, przywróciłbym obszar roboczy do mapowania repozytorium
którego najbliższym współczesnym odpowiednikiem są mapowania lub widoki Perforce , obsługujące częściowe kasy, a także niekolokację obszaru roboczego i repozytorium.
źródło