有没有办法在git checkout中使用通配符?
我想做的是检出单个文件或一组文件,它们具有这样的通用名称
git checkout myBranch */myFile.md
和
diff
(不确定'-'部分)
代替
diff
和
diff
add
checkout
我知道某些git命令(例如diff
和add
)有一些有限的通配符功能,但对checkout
却一无所获。有没有办法?
编辑:我在Linux上使用git 1.7.9.5。 git和shell命令的有效组合也是可以接受的。
Git确实使用fnmatch(3)处理通配符。 请参阅Git词汇表中的pathspec条目。
但是要确保git可以看到通配符,必须将其转义,否则您的shell将首先对其进行扩展。 通常,我在单引号之间使用通配符:
git checkout myBranch -- '*/myFile.md'
通配符将应用于全名,包括目录。
如您在文档中所见,pathspec还允许魔术签名,这些魔术签名更改了解释pathspec的方式。 例如,您可以使用icase设置不区分大小写的路径(可以键入git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT>
来查找所有自述文件)。
如果您在Windows中遇到问题,我在这里引用@bambams的评论:
在Windows 2.8.1.windows.1中,这对我不起作用,并且 利用cmd.exe外壳程序中的Git,因此没有内置的glob。 但是,如果您处于这种遗憾的状态,则可以采用一种解决方案。 结合
git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT>
和xargs
实现您的目标:git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT>
Git不会处理通配符,但是您的Shell会处理。
尝试这个 :
git checkout myBranch **/myFile.md
和
git checkout myBranch **/*Test*
使用2710795314558558141440,您的shell将在当前工作目录开始的所有子目录中查找文件。
电源外壳
@(gci -Recurse *test* | Resolve-Path -Relative) | %{git checkout mybranch -- $_)
gci会生成所有符合条件的文件的列表(*test*
),然后将其通过管道传递到Resolve-Path以获得相对路径。 最后,扁平化的文件名列表(@)被输送到git调用中(每个找到的文件执行一次)。
没有其他答案对我有用,但是bambams评论有用。 我将其设置为接受两个参数的bash函数。用法:
git checkout myBranch'*文件*'
gitcheckout()
{
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null);
pushd .;
cd $GIT_DIR/../;
git diff --name-only $1 -- $2 | xargs git checkout $1 --;
popd;
}