Pobierz pliki Git do lokalizacji poza repozytorium
21
Czy możliwe jest „pobranie” do lokalizacji poza repozytorium? Mam na myśli klon gałęzi bez katalogu „.git”.
Na przykład: Użyj git do zarządzania witryną. Edytujesz niektóre pliki, zatwierdzasz i kopiujesz pliki na serwer WWW za pośrednictwem WebDAV. Ścieżka WebDAV byłaby lokalizacją poza repozytorium, która nie powinna zawierać „.git”.
To może nie być problem, dla którego git został zbudowany, ale czy to możliwe?
Powiedzmy, że mam nagie repozytorium o nazwie /srv/production.gitna docelowym systemie / serwerze.
W systemie docelowym mogę użyć polecenia cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f
Jeśli jestem w repozytorium innym niż nagie, polecenie jest nieco inne. Powiedzmy, że mam nie-nagie repozytorium w /srv/testing. Do kasy, której użyłbymcd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f
W rzeczywistości w moim systemie zautomatyzowałem to nawet po przechwyceniu po production.gitrepozytorium. Więc kiedy wypychasz do production.gitnajnowszej wersji, automatycznie wypisujesz się do katalogu głównego.
#!/bin/sh## An example hook script that is called after a successful# commit is made.## To enable this hook, rename this file to "post-commit".
GIT_WORK_TREE=/srv/production-www/ git checkout -f
# ... misc other commands to verify permissions are set correctly.
Jeśli twój jedyny dostęp do zdalnego systemu to webdav, na pewno powinno być możliwe napisanie haka po zatwierdzeniu, który będzie kasował do hosta webdav, bezpośrednio lub do tymczasowej lokalizacji, którą możesz następnie przesłać w skrypcie.
wyszukiwane w wielu miejscach .. tylko działające rozwiązanie, również czyste!
karthikeayan
6
Jeśli chcesz tylko pliki, możesz użyć git archive. Zwykle zapisuje do archiwum, takiego jak tarballs lub ZIP, ale możesz go także potokować:
git archive master | tar -x -C /some/path
Tutaj masteroczywiście jest gałąź, którą chcesz zarchiwizować i /some/pathbędzie ona zawierać tylko pliki - nie .gitlub .gitignore.
Lub możesz użyć, git checkout-indexktóry bardziej przypomina „pobieranie” plików:
git checkout-index -f -a --prefix=/some/path/
Tutaj -aopcja mówi gito sprawdzeniu wszystkich plików. Prefiks zostanie dołączony do wyjścia. Ktoś również napisał wokół tego opakowanie, aby dać git export.
Myślę, że utrudniasz to, niż musi być. Po prostu uruchom, GIT_WORK_TREE=/destinationpath git checkout -fgdy bieżący katalog znajduje się na szczycie nagiego repozytorium lub podkatalogu .git. Dostaniesz kasę do / destinationpath
Zoredache
Ok, musiałem jakoś przegapić tę opcję, +1 dla ciebie.
slhck
1
Szczerze mówiąc, uważam tę opcję za bardziej intuicyjną. I mniej podatne na błędy.
Jeśli chcesz tylko pliki, możesz użyć
git archive
. Zwykle zapisuje do archiwum, takiego jak tarballs lub ZIP, ale możesz go także potokować:Tutaj
master
oczywiście jest gałąź, którą chcesz zarchiwizować i/some/path
będzie ona zawierać tylko pliki - nie.git
lub.gitignore
.Lub możesz użyć,
git checkout-index
który bardziej przypomina „pobieranie” plików:Tutaj
-a
opcja mówigit
o sprawdzeniu wszystkich plików. Prefiks zostanie dołączony do wyjścia. Ktoś również napisał wokół tego opakowanie, aby daćgit export
.źródło
GIT_WORK_TREE=/destinationpath git checkout -f
gdy bieżący katalog znajduje się na szczycie nagiego repozytorium lub podkatalogu .git. Dostaniesz kasę do / destinationpath