git checkout only certain file types for entire project

后端 未结 6 1225
遥遥无期
遥遥无期 2020-12-31 05:36

Is there a way to perform a git checkout for only certain file types (.xlf), which recurses down through the entire repository? The results should contain the struture of th

6条回答
  •  青春惊慌失措
    2020-12-31 05:44

    Dadaso's answer git checkout -- "*.xml" checks out all .xml files recursively from index to working directory.

    However for some reasons git checkout branch-name -- "*.xml" (checking out files from branch-name branch) doesn't work recursively and only checks "xml" files in root directory.

    So IMO the best is to use git ls-tree then filter file names you are interested in and pass it to git checkout branch-name --. Here are the commands you can use:

    • Bash (and git bash on windows) version:

      git ls-tree branch-name --full-tree --name-only -r | grep "\.xml" | xargs git checkout branch-name --
      
    • cmd (windows) version (if you don't have "C:\Program Files\Git\usr\bin" in you PATH):

      git ls-tree branch-name --full-tree --name-only -r | "C:\Program Files\Git\usr\bin\grep.exe" "\.xml" | "C:\Program Files\Git\usr\bin\xargs.exe" git checkout branch-name --
      
    • for powershell it's still better to call cmd.exe because it's much faster (powershell doesn't have good support for native stdin/stdout pipelining):

      cmd.exe /C 'git ls-tree branch-name --full-tree --name-only -r | "C:\Program Files\Git\usr\bin\grep.exe" "\.xml" | "C:\Program Files\Git\usr\bin\xargs.exe" git checkout branch-name --'
      
    • However you you have small number of files you can try this in powershell (like in @aoetalks answer). But I found it extremely slow for couple of houndeds files:

      git ls-tree branch-name --full-tree --name-only -r | sls "\.xml" | %{ git checkout branch-name -- $_ }
      

提交回复
热议问题