Как `git reset` нерекурсивно использовать глобальное отображение пути? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь запустить 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 внутри одинарных кавычек?

1 Ответ

0 голосов
/ 04 декабря 2018

Как вы указали, * не расширяется под кавычками, и вам просто нужно убрать его из кавычек.Или лучший способ использовать массив и поместить результаты glob и передать их команде.

shopt -s nullglob
xmlFiles=(*.xml)

По умолчанию *.xml не подвергается рекурсивному сглаживанию, необходимо установить специальный параметр, например * 1006.* чтобы достичь этого.Однако для вашего случая вы можете подтвердить только файлы .xml в текущей папке, которые были бы скопированы

echo '*.xml expands to '"${xmlFiles[@]}"''

Так что теперь используйте массив в вашей команде git.

git filter-branch --index-filter \
     'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- '"${xmlFiles[@]}"'' --prune-empty -- --all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...