Git ls-files 行为

Mar*_*ont 3 git wildcard git-ls-files

目前尚不清楚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
Run Code Online (Sandbox Code Playgroud)

HEAD现在在7de8f5b[IP-826-generic-configuration-management-ticket] 将远程跟踪分支 'origin' 合并到 IP-826-generic-configuration-management-ticket

D:\GIT\repo>git status
Run Code Online (Sandbox Code Playgroud)

在分支 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)
Run Code Online (Sandbox Code Playgroud)

没有添加任何提交但存在未跟踪的文件(使用“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!** 
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 5

问题是,如果您*非字符串环境中使用星号 ( ) ,命令行解释器将自行执行扩展:它将查找目录中的文件,在版本控制下不需要,并将这些文件添加为参数。例如,假设目录包含一个文件:

foo-a.txt
foo-b.txt
Run Code Online (Sandbox Code Playgroud)

你调用git ls-files foo-*.txt,实际上你调用了命令git ls-files foo-a.txt foo-b.txt。现在,它有可能foo-c.txt是版本控制之下,但一旦被去除,而foo-a.txtfoo-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
Run Code Online (Sandbox Code Playgroud)

在示例中,我们首先设置了一个 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.