Может ли git rm взять регулярное выражение или я могу передать содержимое файла в git rm? - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь удалить все метафайлы папок из проекта Unity в git-репо, который использует моя команда. Другие участники не удаляют метафайл, связанный с папкой, которую они удалили / опустошили, и распространяют ее среди всех остальныхЭто небольшое раздражение, которое не нужно видеть, поэтому я добавил это в .gitignore:

*.meta
!*.*.meta

и теперь мне нужно удалить только метаданные папки. Я бы лучше удалил метас сейчас, чем подожду, пока они появятся, и пусть мерзавец удалит их позже. Я использую git bash в Windows и пробовал следующие команды, чтобы найти только метаданные папки:

find . -name '*.meta' > test.txt             #returns folders and files
find . -regex '.*\.meta' > test.txt          #again folders and files
find . -regex '\.[^\.]{0,}\.meta' > test.txt #nothing
find . -regex '\.[^.]{0,}\.meta' > test.txt  #nothing
find . -regex '\.{2}' > test.txt             #nothing
find . -regex '(\..*){2}' > test.txt         #nothing

Я знаю, что регулярные выражения интерпретируются по-разному для каждой программы / языка, но следующее даст результаты, которые я хочу получитьNotepad ++, и я не уверен, как перевести его для git или git bash:

^.*/[^.]{0,}\.meta$

, захватив строки (пути к файлам из корня репо), которые заканчиваются на /<foldername>.meta, так как я понял, что некоторые папкисодержит "."в их имени.
Как только это выяснится, мне нужно идти построчно и git rm файлы.

ПРИМЕЧАНИЕ
Я также могу запустить:

^.*/.*?\..*?\.meta$\n

и заменить ничем, чтобы удалить все мета-метки файлов из результатов папок и файлов, и использовать этот результат для получения мета-меток всех папок, но я также хотел бы знать, как избежать использования Notepad ++ какдополнительный шаг.

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Чтобы ограничить результаты только индексированными файлами, используйте git ls-files, швейцарский армейский лист списка файлов с поддержкой индекса. git update-index - это индексатор основных команд,

git ls-files -i -x '*.meta' -x '!*.*.meta' | git update-index --force-remove --stdin

, который удалит файлы из вашего индекса, но оставит их в рабочем дереве.

1 голос
/ 01 октября 2019

Проще выразить с двумя условиями, как в .gitignore. Совпадение *.meta, но исключение *.*.meta:

find . -name '*.meta' ! -name '*.*.meta'

Используйте -exec, чтобы запустить выбранную вами команду для сопоставляемых файлов. {} является заполнителем для имен файлов, а ';' означает конец команды -exec (странный синтаксис, но он полезен, если вы добавляете другие элементы после -exec ... ';').

find . -name '*.meta' ! -name '*.*.meta' -exec git rm {} ';'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...