Git ls文件行为

Git ls文件行为,git,wildcard,git-ls-files,Git,Wildcard,Git Ls Files,尚不清楚使用通配符的git ls文件实际上是如何工作的 我从运行正常的gitls files*.命令开始。它显示所有基础子目录中受版本控制的所有文件 但是现在我想选择一组文件。示例:“设备*.xml” 所以我执行了git ls files Device.*.xml,但没有结果 我知道该命令区分大小写。怎么了?下面是我使用输出执行的命令列表。使用的Git版本:2.6.1.windows.1 D:\GIT\repo>git clean -xdf D:\GIT\repo>git reset

尚不清楚使用通配符的git ls文件实际上是如何工作的

我从运行正常的
gitls files*.
命令开始。它显示所有基础子目录中受版本控制的所有文件 但是现在我想选择一组文件。示例:
“设备*.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

D:\GIT\repo>git status
您的分支机构是“origin/IP-826-generic-configuration-management-ticket”的最新分支机构

Untracked files:
  (use "git add <file>..." to include in what will be committed)
未跟踪的文件:
(使用“git add…”包含在将提交的内容中)
提交时未添加任何内容,但存在未跟踪的文件(使用“git add”跟踪)

D:\GIT\repo\Imagepipe\SettingsDB\GeneratedDevicesAllPlatforms>dir Device.*.xml/s
2015年10月12日10:46 681设备生成设备0-0-0.xml
1个文件681字节
D的目录:\GIT\repo\Tools\DevTools\setingsgenerator\SLIB2\u GenerateSettings\Test\DB7\generatedevices\D1
2015年10月12日10:46 1997设备_D1_0-0-0_0.xml
1个文件1997字节
D:\GIT\repo\Tools\DevTools\setingsgenerator\SLIB2\u GenerateSettings\Test\DB7\S\u NOCHECK的目录
2015年10月12日10:46 1558设备检查0-0-0.xml
1个文件1558字节
D:\GIT\repo\Tools\DevTools\SettingsGenerator\SLIB2\u GenerateSettings\Test\DB7\S\u Test的目录
2015年10月12日10:46 1536设备测试0-0-0.xml
1个文件1536字节
列出的文件总数:
968个文件14032982字节
0目录(s)18400256000字节可用
D:\GIT\repo>GIT ls files Device.*.xml
D:\GIT\repo>
**没有结果!**

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

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
。现在我们添加该文件并进行提交。接下来,我们删除该文件。如果我们现在调用
gitls files foo-*.txt
,则是
fish
(shell)抱怨找不到这样的文件。但是,如果我们以字符串形式传递
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

我试图在windows下复制此命令,但第一个“git ls files foo-*.txt”命令仍然返回foo-c。txt@MarkdeBont:它应该返回
foo-c.txt
,因为它是唯一受版本控制的文件。请参见示例。有趣的是: