2015-12-21 5 views
3

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

Я начал с команды 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-родовое конфигурация-управление-билет] Объединить удаленного отслеживания филиала 'происхождения' в IP-826-родовое -конфигурация-менеджмент билет

D:\GIT\repo>git status 

на ветви IP-826-родовой-конфигурационного управление билетом

Вашего филиал является уточненным с «происхождением/IP-826-родового-Конфигурация- управление билет.

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

ничего не было добавлено к совершению, но неотслеживаемые файлы присутствуют (использование «мерзавец добавить» для отслеживания)

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!** 
+0

Интересны: «мерзавец LS-файлы Foo - * .txt» https://github.com/git/git/commit/de8bada2bf63d274b8f7759f0ffd0b7669e52eca – VonC

ответ

3

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

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 

В примере, мы сначала настроить репозиторий, то мы создаем файл 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, но так как нет такого файла не находится под subversioning, она ничего не возвращает (он не может найти эти файлы). Если вы, тем не менее, используете подстановочный знак с строкой, снова появится foo-c.txt.

+0

я попытался воспроизвести это под окнами, но первая команда по-прежнему возвращает Foo-с. txt –

+0

@MarkdeBont: он должен возвращать 'foo-c.txt', так как это единственный файл под управлением версии. См. Пример. –