Tar una cartella senza file .git?


16

Se eseguo il tar di una cartella che è un repository git, posso farlo senza includere i .gitfile correlati? In caso contrario, come potrei fare per farlo tramite un comando?

Risposte:


23

Dai un'occhiata prima a git help archive. archiveè un comando git che consente di creare archivi contenenti solo file tracciati da git. Probabilmente quello che stai cercando. Un esempio elencato alla fine della pagina man:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

6
questo archivia solo repo git root. Se sono stati utilizzati sottomoduli, le loro directory saranno vuote.
Stann,

@Stann: Grazie, da un altro utente del sottomodulo
Mark K Cowan,

22

Risposta più semplice: Aggiungi --exclude-vcs

--exclude-VCS

Ciò esclude tutte le directory del sistema di controllo della versione

Personalmente io uso

tar -zcvf foo.tar.gz ./FOLDER_NAME --exclude-vcs

quindi tutto ciò che devi fare è aggiungere --exclude-vcs alla fine del comando.


Tutti quelli conosciuti , suppongo? ;)
phk,

3
Tutte le opzioni devono essere insieme prima degli argomenti su GNU / Linux.
Josh Habdas,

2
Come affermato per GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Michael Irey,

20

Se si desidera che l'archivio includa i file monitorati da git, ma non il repository git stesso o qualsiasi file generato o altrimenti non tracciato, utilizzaregit archive .

Se vuoi specificamente escludere .gitma includere tutto il resto, sotto Linux o FreeBSD o OSX o Cygwin, tar ha una semplice opzione per escludere una directory:

tar -c --exclude .git -f - foo | gzip >foo.tgz

Con GNU tar (cioè sotto Linux o Cygwin), puoi accorciarlo a tar czf foo.tgz --exclude .git foo.

Il modo POSIX di creare archivi è pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz

Fa gitcompila su qualsiasi sistema in cui tarnon è disponibile? :-)
Stéphane Gimenez,

1
@ StéphaneGimenez Probabilmente no. Ma si compila su sistemi in cui tarnon esiste alcuna --excludeopzione, come OpenBSD (che ammette duplicare l' sopzione di pax , ma non è un'estensione di sintassi del comando tar comune).
Gilles 'SO- smetti di essere malvagio' il

0

Grazie a una risposta che ho ricevuto su una delle mie domande ho trovato un'altra soluzione. Quindi, per completezza, ecco una soluzione che utilizza find:

find . -path './.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

E se vuoi escludere possibili .gitcartelle all'interno di (sotto) + cartella:

find . -path '*/.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

L'ultimo può essere raggiunto anche attraverso:

find . -type d -name '.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Molto utile se è possibile utilizzare le altre tecniche di filtro di find, ad esempio data di modifica, autorizzazioni, ...

(Come spesso si presuppongono nomi di file ben formati, altrimenti è necessario utilizzare byte null come separatori che possono significare -print0per finde --nullper tarse supportati.)

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.