2016-06-10 10 views
0

Ich versuche eine ziemlich komplexe git Geschichte Beschneidung und fehlgeschlagen, um einen Befehl zu finden, der mit git filter-branch funktioniert. Im Wesentlichen möchte ich alles außer ein paar übereinstimmenden Dateien und Verzeichnissen entfernen.Inverted Shell Globbing innerhalb Git Filter-Zweig

Der Befehl Ich mag würde laufen ist effektiv

git filter-branch -f --prune-empty --tree-filter 'rm -rf ^(FileA.java|dirB)' HEAD 

Aber der git-filter-branch Skript barfs auf den Pars.

/usr/local/Cellar/git/HEAD/libexec/git-core/git-filter-branch: eval: line 360: syntax error near unexpected token `(' 
/usr/local/Cellar/git/HEAD/libexec/git-core/git-filter-branch: eval: line 360: `rm -rf ^(FileA.java|dirB)' 
tree filter failed: rm -rf ^(FileA.java|dirB) 

würde ich eval erwartet habe die eingebetteten Pars gut zu handhaben, aber das ist auch jenseits meiner Schale/zsh Verständnis.

Und der säumige Code in git-filter-branch

if [ "$filter_tree" ]; then 
    git checkout-index -f -u -a || 
     die "Could not checkout the index" 
    # files that $commit removed are now still in the working tree; 
    # remove them, else they would be added again 
    git clean -d -q -f -x 
    eval "$filter_tree" < /dev/null || 
     die "tree filter failed: $filter_tree" 

Antwort

3
git filter-branch -f --index-filter ' 
     git read-tree --empty 
     git reset $GIT_COMMIT fileA.java dirB dirC 
' -- --all -- fileA.java dirB dirC 

immer nur Einwickeln sieht die Commits, die diese Pfade berühren und (b) sich nicht darum kümmern, Inhalte auszuchecken, die niemals untersucht werden. Die einzige Zeit, die Sie brauchen, ist --prune-empty, wenn Sie Commits treffen oder generieren, die nichts ändern, und die Rev-List-Argumente (nach dem ersten --) überspringen alle diese bereits.

0

Noch unsicher, warum ich das nicht mit zsh arbeiten konnte so umsortiert in einem Bash-Skript

$ cat ../purge.sh 
#!/bin/bash 
shopt -s extglob 
rm -rf -- !(FileA.java|dirB|dirC) 

$ git filter-branch -f --prune-empty --tree-filter '../purge.sh' HEAD