Rsync include un'elegante opzione --cvs-exclude
per "ignorare i file nello stesso modo in cui lo fa CVS", ma CVS è obsoleto da anni. C'è un modo per escludere anche file che sarebbero ignorati dai moderni sistemi di controllo delle versioni (Git, Mercurial, Subversion)?
Ad esempio, ho molti progetti Maven controllati da GitHub. In genere includono .gitignore
almeno un elenco target
, la directory di compilazione Maven predefinita (che può essere presente al livello superiore o nei sottomoduli). Poiché il contenuto di queste directory è interamente usa e getta e può essere molto più grande del codice sorgente, vorrei escluderle quando si utilizza rsync per i backup.
Ovviamente posso --exclude=target/
farlo in modo esplicito, ma questo sopprimerà accidentalmente le directory non correlate che per caso hanno un nome target
e non dovrebbero essere ignorate.
E potrei fornire un elenco completo di percorsi assoluti per tutti i nomi di file e modelli menzionati in qualsiasi .gitignore
, .hgignore
o svn:ignore
proprietà sul mio disco, ma questo sarebbe un elenco enorme che dovrebbe essere prodotto da una sorta di script.
Dato che rsync non ha alcun supporto integrato per i checkout VCS oltre a CVS, c'è qualche buon trucco per alimentare i propri schemi di ignoranza? O qualche tipo di sistema di callback in base al quale è possibile chiedere a uno script utente se un determinato file / directory debba essere incluso o meno?
Aggiornamento : --filter=':- .gitignore'
come suggerito da LordJavac sembra funzionare anche per Git come --filter=:C
fa per CVS, almeno sugli esempi che ho trovato, anche se non è chiaro se la sintassi sia una corrispondenza esatta. --filter=':- .hgignore'
non funziona molto bene per Mercurial; ad esempio un .hgignore
contenente una riga come ^target$
(l'equivalente Mercurial di Git /target/
) non è riconosciuto da rsync come espressione regolare. E niente sembra funzionare per Subversion, per il quale dovresti analizzare .svn/dir-prop-base
per una copia di lavoro 1.6 o precedente, e alzare le mani in sgomento per una copia di lavoro 1.7 o successiva.
:-
significa esattamente? Cosa significa il colon? Che cos'è il trattino?
check-ignore
sottocomando che può gestire il duro lavoro di analizzare i vari file "ignorati", se si desidera utilizzare l'opzione "genera un elenco di tutti i file non ignorati". La mia risposta qui fornisce dettagli su come farlo.