Acquista i file Git in una posizione esterna al repository


21

È possibile "effettuare il checkout" in una posizione esterna al repository? Ciò che intendo è un clone di un ramo senza la directory ".git".

Ad esempio: usa git per gestire un sito web. È possibile modificare alcuni file, eseguire il commit e copiare i file su un server Web tramite WebDAV. Il percorso WebDAV sarebbe la posizione esterna al repository, che non dovrebbe contenere il ".git".

Questo potrebbe non essere il problema per cui git è stato creato, ma è possibile?

Risposte:


19

Sì, questo è certamente possibile.

Diciamo che ho un repository nudo chiamato /srv/production.gitsul sistema / server di destinazione.

Sul sistema di destinazione posso usare il comando cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

Se mi trovo in un repository non bare il comando è leggermente diverso. Diciamo che ho un repository non nudo su /srv/testing. Alla cassa che avrei usatocd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

In effetti sul mio sistema lo automatizzo persino in un hook post-commit nel mio production.gitrepository. Quindi, quando si passa production.gitall'ultima versione, si verifica automaticamente il root Web.

#!/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.

Se il tuo unico accesso al sistema remoto è webdav, certamente dovrebbe essere possibile scrivere un hook post-commit che eseguirà il checkout sull'host webdav, direttamente o in una posizione temporanea, che è quindi possibile creare script di un caricamento.


cercato in più posti .. unica soluzione funzionante, anche pulita!
karthikeayan,

6

Se vuoi solo i file, puoi usarli git archive. Di solito scrive in un archivio come tarball o ZIP, ma puoi anche pipe:

git archive master | tar -x -C /some/path

Qui, masterovviamente , è il ramo che vuoi archiviare e /some/pathconterrà solo i file - no .gito .gitignore.


Oppure puoi usare quello git checkout-indexche ricorda più da vicino un "checkout" di file:

git checkout-index -f -a --prefix=/some/path/

Qui, l' -aopzione dice gitdi controllare tutti i file. Il prefisso verrà anteposto all'output. Qualcuno ha anche scritto un involucro attorno a questo per dare un git export.


2
Penso che tu lo stia rendendo più difficile di quanto debba essere. Basta eseguire GIT_WORK_TREE=/destinationpath git checkout -fmentre la directory corrente si trova nella parte superiore di un repository nudo o nella sottodirectory .git. Otterrai un checkout su / destinationpath
Zoredache il

Ok, devo aver perso in qualche modo quell'opzione, +1 per te.
slhck,

1
Trovo questa opzione molto più intuitiva, a dire il vero. E meno soggetto a errori.
Minix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.