在Git中检出多个同名文件

时间:2014-12-12 11:06:49

标签: eclipse git

我在一个大型项目中与其他几个分支合并了多个eclipse项目,并最终改变了一堆org.eclipse.jdt.core.prefs设置,我想在我的分支上恢复。是否有魔术命令我可以用来重置'只有这些文件,在我的git repo中的所有eclipse项目中?

我尝试了一些

的内容
git checkout origin/BRANCH_WITH_CORRECT_FILES -- *org.eclipse.jdt.core.prefs

返回

error: pathspec '*org.eclipse.jdt.core.prefs' did not match any file(s) known to git.

这是因为*?我怎么能绕过它?

1 个答案:

答案 0 :(得分:3)

问题源于git checkout不在子目录中搜索的事实。要使用星号检出文件,您必须指定git可以找到它们的文件夹。

尽管如此,无论它们在存储库中的位置如何,都可以签出名称中包含特定字符串的所有文件。为实现这一目标,我们必须结合许多命令。

git ls-tree -r --name-only <branch> | grep <pattern>

这将返回名称中具有给定模式的所有文件的列表;我们将此命令的输出传递给git checkout,这将相应地更新工作树。

git checkout <branch> -- $(git ls-tree -r --name-only <branch> | grep <pattern>)

魔术就完成了。


为了便于使用,我建议您在全局 gitconfig 中创建一个别名。

git config --global alias.super-checkout '!f() { git checkout $1 -- $(git ls-tree -r --name-only $1 | grep "$2"); }; f'

在此之后,您可以使用git super-checkout <branch> <pattern>命令,或者在您的情况下:

git super-checkout origin/BRANCH_WITH_CORRECT_FILES org.eclipse.jdt.core.prefs

注意:您显然可以使用与super-checkout不同的别名。


请查看git ls-tree documentation以便更好地理解。