pom.xml,**/pom.xml,**/**/pom.xml,然后 **/**/**/pom.xml... 目标文件的快捷方式我们知道它的名称,无论它是什么目录深度?

pom.xml,**/pom.xml,**/**/pom.xml,然后 **/**/**/pom.xml... 目标文件的快捷方式我们知道它的名称,无论它是什么目录深度?

要对所有文件应用一些更改pom.xml,我运行以下命令:

git checkout --theirs **/**/**/**/pom.xml
git checkout --theirs **/**/**/pom.xml
git checkout --theirs **/**/pom.xml
git checkout --theirs **/pom.xml
git checkout --theirs pom.xml

但我找不到针对所有文件的替换pom.xml,无论它们的目录深度是什么级别。

如何在单个命令中完成我所做的事情?

答案1

根据您的要求,这里有两个可能的答案。您不能使用 shell 通配符来匹配尚不存在的文件或目录,因此您不能使用 shell 通配符来指示git要检出哪些项目,除非它们已存在于您的文件系统中。幸运的是git,它本身确实支持针对这种情况的通配符。

  1. 特别是对于git,您需要将 传递**git自身,而 shell 不会尝试扩展它。在这种情况下,使用引号将字符串作为文字传递给git

    git checkout '**/pom.xml'
    
  2. gitshell之外bash还支持双星通配符扩展。文档 ( man bash) 写道,

    globstar**如果设置,路径名扩展上下文中使用的 模式将匹配所有文件以及零个或多个目录和子目录。如果模式后跟/,则仅目录和子目录匹配。

    这是一个默认情况下通常不启用的选项bash,因此您需要启用它:

    shopt -s globstar
    

    此后的例子,

    ls **/pom.xml
    

相关内容