2011-06-18 21 views
5

Jestem pewien, że można to zrobić, po prostu nie jestem pewien właściwej drogi.Czy Git może sklonować nagie repozytorium do innego nagiego repozytorium?

Mój scenariusz polega na tym, że w tym momencie mam podłączony do komputera dysk USB, lokalny dysk twardy i dysk sieciowy. Lokalny dysk twardy będzie zawierał lokalne aktywne repozytorium dla mojej lokalnej pracy. Napęd sieciowy (z długą ścieżką UNC!) Zawiera główne nagie repo, które działa jako kopie referencyjne (2 lub 3 współpracowników w biurze), podczas gdy dysk USB działa jak moja mobilna kopia do sneakernettingu do niektórych zewnętrznych komputerów (moi pozostali współpracownicy mają własne dyski, które mogą wpływać na odpowiedzi). (to jest na windows msysgit).

To jest ustanowienie napęd USB, który jest problemem, i upewniając się, mam skierowanie przepływu pracy we właściwym kierunku (patrz using-git-on-usb-stick-for-travelling-code.

  • powinienem być klonowanie mojego lokalnego repo, lub klonowanie repo sieci?
  • Jakie są specjalne flagi, aby upewnić się, że napęd USB zsiada poprawnie? (-nohardlinks?)
  • itp
+0

Nie możesz mieć twardych linków z jednego (logicznego) dysku do drugiego. – svick

Odpowiedz

0

można sklonować z albo. Jak tylko skończy się napęd USB, możesz go usunąć. Można dokładnie sprawdzić integralność po z

git fsck --full 
+0

Jakieś przemyślenia, które repo należy sklonować? Początkowo myślałem o klonowaniu repozytorium, ale teraz myślę, że powinienem klonować moje lokalne (działające) repozytorium. –

+0

"Podwójna kontrola integralności": zdecydowanie wart krok ;-) –

8

Można utworzyć gołe do naga klon z repo z dłuższą ścieżkę UNC do pamięci USB z

cd /e/src 
git clone --bare //server/path/to/your/network/repo.git

ale wątpię, to kupuje dużo, aby zrobić to w jednym kroku.

Zważywszy, że będziesz pracował w lokalnej aktywnej repo, chciałbym stworzyć gołe repo na pendrive

cd git init --bare /e/src/myproject.git

stworzyć pilota w Twoim aktywnym repo

git remote add usb file:///e/src/myproject.git

a następnie w razie potrzeby naciśnij.

git push usb philip/cool-new-feature

Powyższe polecenia zakładają, że pamięć USB jest E: a katalog roboczy znajduje się w lokalnym aktywnym repo.

Jak rozumiem twoje pytanie, masz co najmniej dwa rozłączne zestawy współpracowników, w zależności od tego, czy twoi pozostali współpracownicy dzielą wspólne centralne repozytorium, czy też pracują na pojedynczych komputerach. Oznacza to, że repozytorium na dysku USB jest repozytorium, do którego wszyscy (w końcu) mają dostęp, więc twoi koledzy z drużyny spędzają większość swojego czasu "w samolocie" w odniesieniu do niego.

Propozycje projektowania procesu rozwoju:

  1. uniknąć sytuacji, w której ty lub ktoś inny zostaje przeznaczona fuzji. Zamiast tego chcesz, aby wszyscy członkowie zespołu integrowali się tak często, jak to tylko możliwe, aby potencjalne sprzeczne zmiany były niewielkie i łatwe w zarządzaniu.
  2. Po rozłącznych współpracownikach zwiększa się ryzyko, że ktoś złamie funkcję, od której ktoś inny zależy, albo przez pozornie nieszkodliwe zmiany, albo nieprawidłowo rozwiązując konflikty scalania. Powinieneś mieć szybką, jednoprzyciskową metodę sprawdzania, czy jakieś regresje lub nowe błędy nie wkradły się do Twojego kodu.
  3. Każda grupa współpracowników, , tj., ci, którzy mają częstszy dostęp do repozytoriów lub wspólnego repozytorium niż do pamięci USB, powinni ćwiczyć ciągłą integrację między sobą. Gdy nowe zatwierdzenia z pamięci USB są dostępne, integracja tego, co mają z nowym kodem z resztą zespołu, powinna stać się priorytetem.

Jednym ze sposobów, w jaki możesz to zrobić, jest sprawienie, by każdy zachowywał czystego mistrza i wprowadzał zmiany tylko w innych oddziałach. posiadanie fizycznej pamięci USB jest naturalnym żeton integracja, więc gdy dany współpracownik ma to sekwencja idzie

git checkout master 
git pull usb master  # should always be a fast-forward 
git merge feature1 
make test    # or whatever, and repeat until no breakage 
git commit 
git push usb master 
git push shared master # if appropriate 
git merge feature2  # if necessary 
...
+0

Mam szczęście, że współpracujemy całkiem nieźle. Częścią problemu jest wymiana między maszynami (i instalowanie pod systemem firmowym ;-)). –

3

zalecam stworzenie klona lustrzane głównej repo sieci:

cd /path/to/usb/drive 
git clone --mirror url://to/main/network/repo/project.git 

A klon lustrzany to repozytorium nagie z tymi samymi gałęziami, znacznikami, itp., co oryginalne repozytorium.

Nie przejmuj się przekazywaniem --no-hardlinks, ponieważ nie jest możliwe trudne połączenie między systemami plików.

Gdy chcesz zaktualizować lustro USB, wystarczy zamontować go i uruchom następujące:

cd /path/to/usb/drive/project.git 
git remote update -p 

Jeśli kiedykolwiek wcisnąć w lustro napędu USB, najlepszym sposobem, aby te zobowiązuje do głównego repo sieci jest dostępne za pośrednictwem lokalnego repozytorium dysku twardego:

# initial setup 
cd /path/to/local/project 
git remote add usb /path/to/usb/drive/project.git 

# grab the commits from the usb drive 
git remote update -p 

# merge the usb drive commits into your local master branch 
git merge usb/master 

# push the result up to the main network repo 
git push 
+0

Prawdopodobnie nie użyję "polecania tworzenia kopii lustrzanej twojego głównego repo sieci" dla tego (mojego obecnego) przepływu pracy, głównie dlatego, że każdy z nas opracowuje nowe fragmenty kodu i nie będzie przesuwać ich do głównego repozytorium (sieci), dopóki nie będziemy gotowi, ale będzie próbował wypróbować na urządzeniu off-net (stąd transfer USB). Widzę przepływy pracy, ale byłoby to słuszne. –

Powiązane problemy