Mam serwer, na którym mam puste repozytorium do wypychania. Jednak mój serwer musi mieć kopię roboczą gałęzi głównej.Uzyskiwanie działającej kopii nagiego repozytorium
Jak uzyskać kopię roboczą i tylko z gołego repozytorium?
Mam serwer, na którym mam puste repozytorium do wypychania. Jednak mój serwer musi mieć kopię roboczą gałęzi głównej.Uzyskiwanie działającej kopii nagiego repozytorium
Jak uzyskać kopię roboczą i tylko z gołego repozytorium?
Można po prostu sklonować repozytorium do innego katalogu na tym samym komputerze:
git clone /bare/repo/dir.git
Bieżący katalog stanie się zakaz gołe klonem swojej repo, a dostaniesz kasę z master
branży automatycznie. Następnie użyj zwykłych poleceń, takich jak git pull
, aby zaktualizować go w razie potrzeby.
Jako korzyść uboczna, ta operacja jest bardzo wydajna - jeśli podasz katalog lokalny do git clone
, git spróbuje udostępnić obiekty między tymi dwoma repozytoriami za pomocą twardych linków.
Możesz użyć do tego celu "git show".
http://www.kernel.org/pub/software/scm/git/docs/git-show.html
Zasadniczo:
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file.txt
Szukałem podejścia "wolnostojący drzewa pracy" (jak widać here):
git init --bare
git config core.worktree /somewhere/else/
git config core.bare false
git checkout -f
Zauważ, że musisz uruchomić 'core.bare' przed linią' core.worktree', jak zaznaczono w komentarzach do tego wpisu na blogu (i potwierdzone przeze mnie właśnie teraz). W przeciwnym razie pojawi się błąd 'fatal: core.bare i core.worktree nie mają sensu'. – craigpatik
Dziwne, tak samo zrobiłem: https://gist.github.com/joallard/8871673. Może zachowanie w Git zmieniło się w pewnym momencie? –
Wygląda na to, * że * jest blisko * tego, czego potrzebuję, ale twój link jest zepsuty, a polecenia podane powyżej nie są tak naprawdę wystarczająco wyjaśnione, że mogę je dostosować do moich potrzeb. Czy możesz naprawić link i/lub wyjaśnić, co się tam dzieje? – Wildcard
To riff off drugiej 2 odpowiedzi, ale wypełnia lukę dla mojego przypadku użycia - działa na aktualizację repo od gałęzi pochodzenia i odliczania i wszelkich operacji git, ponieważ kończy się normalnym komp lete git repo.
git clone /path/to/bare/repo /new/path/to/full/repo
cd /new/path/to/full/repo
git remote set-url origin [email protected]:swift/swift.git
Po wykonaniu tych 3 linie kodu możesz następnie git pull
i git branch
i git checkout some_branch
i tak dalej, bo masz teraz normalną pełną repo git podłączony do zdalnego repo.
Twój jedyny, który wspomniał o some_branch, powinieneś rozwinąć. Próbowałem znaleźć przykład dla oddziału, a ten był gorący w google dla oddziału i jest częścią OQ. ... – blamb
Jak to działa:
$ git init --separate-git-dir /path/to/existing-bare-repository /path/to/workdir
$ cd /path/to/workdir
$ git checkout .
voila!
Informacje: git init
będzie raportować: Reinitialized existing Git repository in /path/to/existing-bare-repository
. Ale bądź pewny siebie. man git-init
mówi: Uruchamianie git init w istniejącym repozytorium jest bezpieczne. Nie nadpisze rzeczy, które już tam są.
Magia polega na tym, że sama nazwa git init
nie powoduje, że pliki pojawiają się w katalogu roboczym. Musisz wyewidencjonować katalog główny.
Nagie repozytorium to po prostu katalog .git katalogu roboczego i wpis w lokalnym pliku konfiguracyjnym.Co zrobiłem przekonwertować gołego repozytorium do pełnego jeden jest:
.git
i przenieść wszystkie pliki z gołego repozytorium tam.git/config
zmienić bare = true
do bare = false
Można ustawić atrybut ukryty katalogu .git
w systemie Windows, ale nie na plikach wewnątrz katalogu.
Czy ta operacja działa w przypadku aktualizacji? –
Jakie aktualizacje? Sklonowane repozytorium jest po prostu kolejnym klonem, więc jego działające drzewo musiałoby zostać zaktualizowane za pomocą 'git pull'. Jeśli chcesz, aby to się stało automatycznie, możesz ustawić hak serwera 'post-receive', aby uruchomić' git pull' na klonie. – user4815162342
No jasne, oczywiście. Myślałem w kategoriach "klonowania" za dużo. –