2016-06-10 2 views
0

Я пытаюсь довольно сложную обрезку истории git и не могу найти команду, которая работает с git filter-branch. По сути, я хочу удалить все, кроме нескольких подходящих файлов и каталогов.Перевернутая оболочка, зависающая внутри git filter-branch

Команда, которую я хотел бы работать эффективно

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

Но git-filter-branch сценарий barfs на круглые скобки.

/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) 

Я бы ожидал eval обрабатывать вложенные скобки хорошо, но это также вне моей оболочки/ЗШ понимание.

И код обижая в 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" 

ответ

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

когда-либо видит коммиты, которые касаются этих путей, и (б) не утруждает себя проверкой содержимого, которое никогда не будет проверено. Единственный раз, когда вам нужно --prune-empty - это когда вы собираетесь сталкиваться или генерировать коммиты, которые ничего не меняют, а arg rev-list (после первого --) пропустить все те, что уже есть.

0

Тем не менее уверены, почему я не мог получить эту работу с Zsh так прибегли к оборачивать в Баш скрипт только

$ 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 

 Смежные вопросы

  • Нет связанных вопросов^_^