Я пытаюсь запустить git reset
для каждого коммита, как часть запроса git index-filter
:
$ git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- *.xml' --prune-empty -- --all
Однако, поскольку git reset
находится в пределаходиночные кавычки, *
не подвергается Bash оболочки оболочки;вместо этого он обрабатывается правилами пути пути git.
Это не работает должным образом, потому что я не могу найти способ git reset
только сбросить файлы в корне хранилища.
Рассмотрим следующий пример git repo:
.git/
a.xml
q.xml
directory1/b.xml
directory2/directory3/filename.txt
Требуется: только a.xml
и q.xml
должны быть сброшены
Наблюдаемые: a.xml
, q.xml
и directory1/b.xml
являются все получение сброса.
Я пробовал следующее:
git reset '/*.xml'
- это не удается, потому что он пытается git reset
против каталога /
, который явно не находится в моем git-репозитории git reset './*.xml'
- что удивительно, это также сбрасывает b.xml
git reset '$(find * -type f -maxdepth 1)'
- $()
не распознаетсяна git reset
, и, конечно, git не передает его Bash для обработки, так что это завершается ошибкой с сообщением об ошибке git reset a.xml q.xml
- это работает хорошо , но,предполагается, что это только два XML-файла в корне репозитория за во всех прошлых ревизиях моего проекта (учитывая, что index-filter
работает противкаждая прошлая ревизия).Так что это вроде работает, но не правильно .
Итак, есть ли действительный git reset
pathspec, который действительно будет работать здесь?
В качестве альтернативы,могу ли я переписать свою команду, чтобы избежать одинарных кавычек, чтобы Bash мог интерпретировать глобусы?(Я уверен, что это было бы неуместно, потому что оно будет применяться только к текущим файлам в последней редакции репозитория, а не к тем, которые существовали в прошлых состояниях.)
Может быть, я должен был буквально вызывать bash
внутри одинарных кавычек?