Un modo per farlo è il contrario: rimuovere tutto tranne il file che si desidera conservare.
Fondamentalmente, fai una copia del repository, quindi usa git filter-branch
per rimuovere tutto tranne il file / le cartelle che vuoi conservare.
Ad esempio, ho un progetto da cui desidero estrarre il file tvnamer.py
in un nuovo repository:
git filter-branch --tree-filter 'for f in *; do if [ $f != "tvnamer.py" ]; then rm -rf $f; fi; done' HEAD
Questo utilizza git filter-branch --tree-filter
per eseguire ogni commit, eseguire il comando e ripetere il contenuto delle directory risultanti. Questo è estremamente distruttivo (quindi dovresti farlo solo su una copia del tuo repository!) E può richiedere del tempo (circa 1 minuto su un repository con 300 commit e circa 20 file)
Il comando precedente esegue semplicemente il seguente script di shell su ogni revisione, che dovresti ovviamente modificare (per escludere la tua sottodirectory invece di tvnamer.py
):
for f in *; do
if [ $f != "tvnamer.py" ]; then
rm -rf $f;
fi;
done
Il problema più evidente è che lascia tutti i messaggi di commit, anche se non sono correlati al file rimanente. Lo script git-remove-empty-commits , risolve questo problema ..
git filter-branch --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'
È necessario utilizzare l' -f
argomento force run filter-branch
again con qualsiasi cosa in refs/original/
(che fondamentalmente un backup)
Ovviamente questo non sarà mai perfetto, ad esempio se i tuoi messaggi di commit menzionano altri file, ma è quanto di più vicino consentito da una git current (per quanto ne so comunque).
Di nuovo, eseguilo sempre e solo su una copia del tuo repository! - ma in sintesi, per rimuovere tutti i file tranne "thisismyfilename.txt":
git filter-branch --tree-filter 'for f in *; do if [ $f != "thisismyfilename.txt" ]; then rm -rf $f; fi; done' HEAD
git filter-branch -f --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'