Git ls 文件行为
Git ls-files behaviour
尚不清楚 git ls-files
使用 通配符 的实际运作方式。
我从 git ls-files *.*
命令开始,它工作正常。它显示所有底层子目录中受版本控制的所有文件
但是现在我要select一组文件。示例:"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-管理票
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!**
问题是如果你在非字符串环境中使用星号(*
),命令行解释器将执行扩展 本身:它将查看 目录 中的文件,在版本控制下不需要,并将这些文件添加为参数。例如,假设该目录包含一个文件:
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
(shell)抱怨找不到这样的文件。但是,如果我们在字符串中传递 foo-*.txt
,git
匹配 foo-c.txt
.
没有问题
如果我们稍后将foo-a.txt
和foo-b.txt
添加到目录中,通过在字符串环境外执行通配符,git
得到git ls-files foo-a.txt foo-b.txt
,但由于没有这样的文件正在颠覆,它 returns 什么都没有(它找不到这些文件)。但是,如果您使用带字符串的通配符,它将再次出现 foo-c.txt
.
尚不清楚 git ls-files
使用 通配符 的实际运作方式。
我从 git ls-files *.*
命令开始,它工作正常。它显示所有底层子目录中受版本控制的所有文件
但是现在我要select一组文件。示例:"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-管理票
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!**
问题是如果你在非字符串环境中使用星号(*
),命令行解释器将执行扩展 本身:它将查看 目录 中的文件,在版本控制下不需要,并将这些文件添加为参数。例如,假设该目录包含一个文件:
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
(shell)抱怨找不到这样的文件。但是,如果我们在字符串中传递 foo-*.txt
,git
匹配 foo-c.txt
.
如果我们稍后将foo-a.txt
和foo-b.txt
添加到目录中,通过在字符串环境外执行通配符,git
得到git ls-files foo-a.txt foo-b.txt
,但由于没有这样的文件正在颠覆,它 returns 什么都没有(它找不到这些文件)。但是,如果您使用带字符串的通配符,它将再次出现 foo-c.txt
.