2012-09-16 17 views

Odpowiedz

18

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.

+0

Czy ta operacja działa w przypadku aktualizacji? –

+0

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

+0

No jasne, oczywiście. Myślałem w kategoriach "klonowania" za dużo. –

8

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 
+3

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

+0

Dziwne, tak samo zrobiłem: https://gist.github.com/joallard/8871673. Może zachowanie w Git zmieniło się w pewnym momencie? –

+0

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

3

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.

+0

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

1

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.

6

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:

  • Utwórz nowy podkatalog .git i przenieść wszystkie pliki z gołego repozytorium tam
  • edytować plik .git/config zmienić bare = true do bare = false
  • Sprawdź gałąź, którą chcesz. Spowoduje to wyodrębnienie wszystkich plików z repozytorium do katalogu roboczego.

Można ustawić atrybut ukryty katalogu .git w systemie Windows, ale nie na plikach wewnątrz katalogu.

+1

Działa jak urok. Pomógł odzyskać repozytoria z instalacji bitbucket. – ibai

+0

Owesome ..! to też zadziałało dla mnie – Olu

Powiązane problemy