Git ls-файлы поведения

Не понятно как git ls-files использование подстановочных знаков на самом деле функционирует.

Я начал с git ls-files *.* Команда, которая работает хорошо. Он показывает все файлы, находящиеся под контролем версий, во всех нижележащих подкаталогах. Но теперь я хочу выбрать набор файлов. Пример: "Device_*.xml"

Итак, я выполняю git ls-files Device_*.xml но это не дает результата?!

Я знаю, что команда чувствительна к регистру. Что случилось? Ниже приведен список команд, которые я выполняю с выводом. Используемая версия Git: 2.6.1.windows.1

D:\GIT\repo>git clean -xdf
D:\GIT\repo>git reset --hard

HEAD сейчас на 7de8f5b [IP-826-generic-configuration-management-ticket] Объединить ветку удаленного отслеживания origin в IP-826-generic-configuration-management-ticket

D:\GIT\repo>git status

На ветке IP-826-generic-configuration-management-ticket

Ваш филиал обновлен с помощью "origin/IP-826-generic-configuration-management-ticket".

Untracked files:
  (use "git add <file>..." to include in what will be committed)

ничего не добавлено для фиксации, но есть неотслеживаемые файлы (используйте "git add" для отслеживания)

 D:\GIT\repo\Imagepipe\SettingsDB\GeneratedDevicesAllPlatforms>dir Device_*.xml /s

<LOT OF DEVICE_*.xml FILES HERE> 

12/10/2015  10:46               681 Device_GeneratedDevices_0-0-0_0.xml
1 File(s)            681 bytes

 Directory of            D:\GIT\repo\Tools\DevTools\SettingsGenerator\SLIB2_GenerateSettings\Test\DB7\GeneratedDevices\D1
12/10/2015  10:46             1,997 Device_D1_0-0-0_0.xml
1 File(s)          1,997 bytes

 Directory of     D:\GIT\repo\Tools\DevTools\SettingsGenerator\SLIB2_GenerateSettings\Test\DB7\S_NOCHECK

12/10/2015  10:46             1,558 Device_S_NOCHECK_0-0-0_0.xml
1 File(s)          1,558 bytes

 Directory of     D:\GIT\repo\Tools\DevTools\SettingsGenerator\SLIB2_GenerateSettings\Test\DB7\S_TEST

12/10/2015  10:46             1,536 Device_S_TEST_0-0-0_0.xml
1 File(s)          1,536 bytes

Total Files Listed:
         968 File(s)     14,032,982 bytes
           0 Dir(s)  18,400,256,000 bytes free

D:\GIT\repo>git ls-files Device_*.xml
D:\GIT\repo>

**No result!** 

1 ответ

Проблема в том, что если вы используете звездочку (*) в нестроковой среде интерпретатор командной строки будет выполнять расширение самостоятельно: он будет искать файлы в каталоге, не являющиеся необходимыми при управлении версиями, и добавлять их в качестве аргумента. Например, допустим, что каталог содержит файлы:

foo-a.txt
foo-b.txt

и вы звоните git ls-files foo-*.txtна самом деле вы вызываете команду git ls-files foo-a.txt foo-b.txt, Теперь возможно, чтоfoo-c.txt находится под контролем версий, но когда-то был удален, и это foo-a.txt а также foo-b.txt нет, в результате чего ни один файл не указан.

Однако если вы используете звездочку в строковой среде, например git ls-files "foo-*.txt"звездочка интерпретируетсяgit, Таким образом, если в хранилище есть файл, соответствующий шаблону, он будет возвращен.

Пример:

> git init 
Initialized empty Git repository in /foo/bar/.git/
> ls
> touch foo-c.txt 
> git add .; git commit -am 'foo-c'
[master (root-commit) 3523fc3] foo-c
 1 file changed, 1 insertion(+)
 create mode 100644 foo-c.txt
> rm foo-c.txt 
> git ls-files
foo-c.txt
> git ls-files foo-*.txt
fish: No matches for wildcard 'foo-*.txt'.
git ls-files foo-*.txt
             ^
> git ls-files 'foo-*.txt'
foo-c.txt
> touch foo-a.txt
> touch foo-b.txt
> git ls-files 'foo-*.txt'
foo-c.txt
> git ls-files foo-*.txt

В этом примере мы сначала настраиваем репозиторий git, затем создаем файл foo-c.txt, Теперь мы добавляем этот файл и делаем коммит. Далее мы удаляем файл. Если мы сейчас позвоним git ls-files foo-*.txt, это fish (оболочка), которая жалуется, что такой файл не может быть найден. Однако если мы пройдем foo-*.txt в строке, git не имеет проблем с соответствием foo-c.txt,

Если позже мы добавим foo-a.txt а также foo-b.txt в каталог, выполнив подстановочный знак вне строкового окружения, git получает git ls-files foo-a.txt foo-b.txt, но так как ни один такой файл не находится в подрывной деятельности, он ничего не возвращает (он не может найти эти файлы). Однако, если вы используете подстановочный знак со строкой, снова появится foo-c.txt,

Другие вопросы по тегам