我想要检查单个文件或一组具有此类通用名称的文件
git checkout myBranch */myFile.md
和
git checkout myBranch -- */*Test*
(不确定' - '部分)
而不是
git checkout myBranch src/main/java/a/deep/package/structure/myFile.md
和
git checkout myBranch src/test/java/a/deep/package/structure/TestOne.java
git checkout myBranch src/test/java/a/deep/package/structure/TestTwo.java
git checkout myBranch src/test/java/a/deep/package/structure/resources/TestData.sql
我知道某些git命令(如diff
和add
)存在一些有限的通配符功能,但却找不到checkout
的任何内容。有办法吗?
答案 0 :(得分:57)
Git 使用fnmatch(3)处理通配符。请参阅Git glossary中的 pathspec 条目。
但是为了确保git可以看到通配符,它们必须被转义,否则你的 shell 将首先展开它们。通常,我在单引号之间使用通配符:
git checkout myBranch -- '*/myFile.md'
通配符应用于整个名称,包括目录。
正如您在文档中看到的那样,pathspec还允许魔术签名,它改变了如何解释pathspec。例如,您可以使用 icase 创建不区分大小写的路径(您可以键入':(icase)*readme*'
来查找所有自述文件。
我在这里引用@ bambams的评论,以防你在Windows中遇到问题:
对于使用2.8.1.windows.1和我的Windows的Windows,这不适合我 利用cmd.exe shell中的Git,所以没有内置的globbing。有 但如果你处于这种令人遗憾的状态,这是一个解决方案。结合
git diff --name-only
和xargs
来实现您的目标:git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT>
答案 1 :(得分:19)
Git不处理通配符,但你的shell会处理。
试试这个:
git checkout myBranch **/myFile.md
和
git checkout myBranch **/*Test*
使用**
,您的shell将从当前工作目录开始查找所有子目录中的文件。
答案 2 :(得分:1)
Powershell
@(gci -Recurse *test* | Resolve-Path -Relative) | %{git checkout mybranch -- $_)
gci生成一个符合条件(*test*
)的所有文件的列表,然后将其通过管道传递到Resolve-Path以获得相对路径。最后,将扁平化的文件名列表(@)输送到git调用中(每个找到的文件执行一次)。
答案 3 :(得分:1)
带有xargs的Windows git bash
git difftool myBranch --name-only *.java | xargs git checkout myBranch
答案 4 :(得分:0)
其他答案都没有对我有用,但bambams评论有效。我把它变成了一个接受两个args的bash函数。 用法:
gitcheckout myBranch&#39; *文件*&#39;
select
答案 5 :(得分:0)
如果您有gitignore或未跟踪的文件,并且想在git checkout中使用通配符,则可能会给您带来问题,解决方案可能是:
git ls-files '*/myFile.md' | tr '\n' '\0' | xargs -0 -L1 -I '$' git checkout -- '$'
答案 6 :(得分:0)
知道git从第3个字符返回分支列表名称后,就可以切换到通过[mask]定义的所需分支:
BRANCH_NAME=$(git branch --list | grep [mask] | cut -c3-)
git checkout ${BRANCH_NAME}
答案 7 :(得分:0)
对我来说,任务是检出以一种模式命名的多个文件:
./a/b/c/FirstTest.java
.d/e/f/SecondTest.java
./g/h/i/ThirdTest.java
我使用了以下bash命令:
# 1. Find files named after "*Test.java" pattern.
# 2. Execute checkout command on every found file.
find . -name "*Test.java" -exec git checkout master {} \;
首先,您可以使用简单的find
测试echo
命令,该命令仅打印给定的文本(在我们的例子中,{}
将被shell替换为当前找到的文件名) :
find . -name "*Test.java" -exec echo {} \;