Git Clone: ​​solo i file, per favore?


141

Voglio clonare un repository GIT e NON finire con una .gitdirectory. In altre parole, voglio solo i file. C'è un modo per fare questo?

git clone --no-checkoutfatto esattamente l'opposto di quello che voglio (mi ha dato solo la .gitdirectory).

Sto provando a farlo per un repository remoto , non locale, nel senso che questo non è un duplicato di " Come fare un" git export "(come" svn export ") " (anche se la soluzione potrebbe finire per essere il stesso).



@Greg Hewgill Sto provando a farlo da un repository remoto. Non sono sicuro se questo rende unica questa domanda, però.
Dan Rosenstark,

1
Anche se questa è una domanda più recente, ma credo che questo vale la pena di controllare: stackoverflow.com/questions/11497457/...
eonil

1
Vedi la mia risposta di aggiornamento : git archiveè ora (Q4 2017) più preciso e non includerà cartelle vuote.
VonC,

1
Prego. Apparentemente, il tuo commento è stato contrassegnato e rimosso ... chat.stackoverflow.com/transcript/134259?m=39402889#39402889
VonC

Risposte:


75

Il comando git che sarebbe il più vicino a quello che stai cercando sarebbe git archive.
Vedi il progetto di backup che usa git : includerà in un archivio tutti i file (inclusi i sottomoduli se stai usandogit-archive-all script)

È quindi possibile utilizzare tale archivio ovunque, restituendo solo file, nessuna .gitdirectory.

git archive --remote=<repository URL> | tar -t

Se hai bisogno di cartelle e file solo dal primo livello:

git archive --remote=<repository URL> | tar -t --exclude="*/*"

Per elencare solo le cartelle di primo livello di un repository remoto:

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"

Nota: non funziona con GitHub (non supportato)

Quindi dovresti clonare (superficiale per accelerare il passaggio del clone) e quindi archiviare localmente :

git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar

Un'altra opzione sarebbe quella di fare un clone superficiale (come menzionato di seguito), ma localizzando la cartella .git altrove.

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo

La cartella repo includerebbe solo il file, senza .git .

Nota: git --git-dir è un'opzione del comandogit , nongit clone .


Aggiornamento con Git 2.14.X / 2.15 (Q4 2017): farà in modo di evitare l'aggiunta di cartelle vuote .

" git archive", specialmente se usato con pathspec, ha memorizzato una directory vuota nel suo output, anche se Git stesso non lo fa mai.
Questo è stato risolto.

Vedi commit 4318094 (12 set 2017) di René Scharfe (``) .
Suggerito da: Jeff King ( peff) .
(Unita da Junio ​​C Hamano - gitster- in commit 62b1cb7 , 25 set 2017)

archive: non aggiungere directory vuote agli archivi

Mentre git non tiene traccia di directory vuote, git archive può essere ingannato nel metterne alcune negli archivi.
Sebbene sia supportato dal database degli oggetti, non può essere rappresentato nell'indice e pertanto è improbabile che si verifichi in natura.

Dato che le directory vuote non sono supportate da git, non dovrebbero nemmeno essere scritte negli archivi.
Se è davvero necessaria una directory vuota, è possibile rintracciarla e archiviarla inserendovi un .gitignorefile vuoto .


4
Questo ha funzionato per me. Vorrei aggiungere un'altra cosa. Se non ti interessa affatto la cartella .git, allora git --git-dir=/dev/null clone --depth=1 /url/to/repo
userei

Questo non rimuove la cartella .git
aliasav

@VonC Ho provato: git --git-dir = / dev / null clone --depth = 1 / url / to / repo
aliasav

1
In esecuzione git archive --remote=https://github.com/pornel/dssim.git @ | tar -tottengo tar: This does not look like a tar archive. Non funziona con GitHub? Inoltre, cosa @significa?
André Werlang,

2
@ AndréWerlang 7 anni dopo ... Non sono troppo sicuro di @: l'ho rimosso. Anche GitHub non supporta un telecomando git archive: ho modificato la risposta per proporre un'alternativa.
VonC,

59
git archive --format=tar --remote=<repository URL> HEAD | tar xf -

preso da qui


2
--format=tarnon è necessario. "tar" è l'output predefinito, non è necessario specificarlo.
VasiliNovikov,

1
tubazioni in tar xè sufficiente
Jens Bannmann

42

puoi creare un clone superficiale per ottenere solo le ultime revisioni:

 git clone --depth 1 git://url

quindi è sufficiente eliminare la directory .git o utilizzare git archiveper esportare l'albero.


Come evitare questo errore quando lo aggiorno ripetendo il clone: ​​"fatale: il percorso di destinazione 'XYZ' esiste già e non è una directory vuota".
Sohail Si,

1
@SohailSi: clona in una nuova posizione o rimuovi la vecchia directory. Probabilmente stai meglio recuperando le nuove revisioni, se vuoi aggiornare la tua copia locale.
Knittl,

3

Perché non eseguire un clone e quindi eliminare la .gitdirectory in modo da avere solo una copia funzionante?

Modifica: O in effetti perché usare il clone? È un po 'confuso quando dici che vuoi un repository git ma senza una .gitdirectory. Se vuoi dire che vuoi solo una copia di uno stato dell'albero, perché non farlo cp -Rnella shell invece del clone git e quindi eliminare il .gitsuccessivo.


Grazie per quello I file sono in un repository git. Speravo di essere in grado di indirizzare gli utenti Mac a ottenere una copia del repository in una riga, senza che diventasse un repository GIT.
Dan Rosenstark,

Non dovresti avere persone che ottengono direttamente il codice dal repository se non possono usarlo (cioè non hanno il repository Git).
alternativa il

@Amoss Rilasciare un tarball in modo che le persone non prendano costantemente l'ultimo codice?
alternativa il

1
@mathepic: e per rilasciare un tarball è necessario un modo per estrarre una copia di lavoro pulita dal repository, che è esattamente la domanda posta.
Andrew,

1
Leggere la risposta qui sotto e poi fare un po 'di googling ha portato a un'altra domanda: stackoverflow.com/questions/160608/… Se dai un'occhiata all'utilizzo dell'archivio git --remote, allora fa esattamente quello che tu (e il poster originale ) stanno cercando. Modifica: che è quello che Jon ha risposto più in basso.
Andrew,

2

Sembra che tu voglia solo una copia del codice sorgente. In tal caso, perché non copiare semplicemente la directory ed escludere la directory .git dalla copia?


5
Questo è quello che sto chiedendo: come farlo con Git ... Posso già dire che non esiste un modo integrato per farlo dalle risposte che sto ricevendo, però. Grazie comunque!
Dan Rosenstark,

2

git checkout -f

C'è un altro modo per farlo dividendo il repository dall'albero di lavoro.

Questo metodo è utile se è necessario aggiornare questi file git senza git su base regolare. Ad esempio, lo uso quando devo controllare i file di origine e creare un artefatto, quindi copiarlo in un repository diverso solo per la distribuzione su un server e lo uso anche quando spingo il codice sorgente su un server quando voglio il codice sorgente da verificare e compilare nella directory www.

Creeremo due cartelle, una per quella git per i file di lavoro:

mkdir workingfiles
mkdir barerepo.git

inizializzare un repository bare git:

cd barerepo.git
git --bare init 

Quindi creare un hook post-ricezione:

touch hooks/post-receive
chmod ug+x hooks/post-receive

Modifica post-ricezione nel tuo editor preferito:

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

Aggiungi questo come telecomando:

git remote add myserver ssh://user@host:/path/to/barerepo.git

Ora ogni volta che si spinge in questo repository nudo, verrà verificato l'albero di lavoro /workingfiles/. Ma di per /workingfiles/sé non è sotto il controllo della versione; l'esecuzione git statusin /workingfiles/darà l'errore fatal: Not a git repository (or any parent up to mount point /data). Sono solo file semplici.

A differenza di altre soluzioni rm -r .gitnon è necessario il comando, quindi se si /workingfiles/tratta di altri repository git non è necessario preoccuparsi del comando utilizzato per rimuovere i file git dell'altro repository.


1
Concordato. Qui è possibile un hook post-ricezione su un repository nudo. +1
VonC

un sacco di lavoro se stai solo cercando di ottenere i file
Rainb

Non richiede molto lavoro se si desidera solo i file su base regolare.
Slam
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.