2013-03-01 280 views
35

我想什麼做的是籤一個文件或一個共同的名字的一部分這樣有沒有辦法通過git checkout使用通配符?

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

我知道有像diffadd一些混帳命令一些有限的通配符功能,但沒有發現任何的checkout。有沒有辦法?

編輯:我在Linux上使用git 1.7.9.5。 git和shell命令的工作組合也是可以接受的。

+0

奇怪,'混帳diff'似乎並不支持通配符對我來說,雖然'git的add'和'commit'做。 – TankorSmash 2013-06-04 15:27:58

回答

30

Git 確實處理通配符,使用fnmatch(3)。請參閱pathspec條目Git glossary

但要確保git可以看到通配符,它​​們必須被轉義,否則你的shell將首先擴展它們。通常情況下,我用單引號之間的通配符:

git checkout myBranch -- '*/myFile.md' 

通配符應用到整個名稱,目錄包括在內。

正如您在文檔中看到的,pathspec還允許魔術簽名,它改變了如何解釋pathspec。例如,您可以通過輸入icase(您可以輸入':(icase)*readme*'查找所有自述文件)來區分不區分大小寫的路徑。

我引用@ bambams的評論在這裏,如果你在Windows問題:

這不是2.8.1.windows.1爲我工作在Windows和我 利用的Git從cmd.exe外殼,所以沒有內置的globbing。然而,如果你處於這樣一個不幸的狀態,有一個解決方案 。結合git diff --name-onlyxargs來實現自己的目標:

git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> 
+1

晚會有點遲,但無疑是正確的。謝謝@coredump,時間移動綠色複選標記:) – kostja 2015-10-24 14:34:50

+0

@kostja是的,絕對遲到;-)謝謝 – coredump 2015-10-25 16:06:53

+1

但沒有辦法通配符的分支名稱,例如'git結帳我*'? – dumbledad 2016-03-04 14:03:21

21

Git不處理通配符,但是你的shell會處理這個通配符。

試試這個:

git checkout myBranch **/myFile.md 

git checkout myBranch **/*Test* 

隨着**,你的shell會尋找文件從當前工作目錄開始的所有子目錄。

+0

按廣告形式工作。謝謝Intrepidd – kostja 2013-03-01 16:01:49

+6

請注意,此_only_會考慮shell看到的文件,例如檢出文件。它不會檢出尚不存在的文件。 – vonbrand 2013-03-02 04:20:46

+0

@vonbrand:任何方式來處理提交中但目前不在文件系統中的文件? – Gauthier 2013-08-27 12:27:38

0

其他答案都不爲我工作,但bambams評論工作。我將它變成了一個接受兩個參數的bash函數。 用法:

gitcheckout 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; 
} 
相關問題