GIT:签出到一个特定的文件夹

我想用类似的东西:

git checkout -- <path>/<file> 

但我想签出文件到我select的某个文件夹,而不是覆盖本地/。

任何想法?

按照“git export”(如“svn export”)?

你可以使用git checkout-index ,这是一个低级命令,如果你想导出所有的东西,你可以使用-a

 git checkout-index -a -f --prefix=/destination/path/ 

引用手册页:

最后的“/”(在前缀上)很重要。 导出的名称实际上只是以指定的string作为前缀。

如果你想导出一个特定的目录,有一些技巧。 该命令只需要文件,而不是目录。 要将其应用于目录,请使用“find”命令并将输出传递给git。

 find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin 

另外从手册页:

直觉性不是这里的目标。 重复性是。

另一个更清洁的解决scheme – 只需指定一个不同的工作树。

要检查从HEAD(而不是索引)到特定输出目录的所有内容:

 git --work-tree=/path/to/outputdir checkout HEAD -- . 

要从HEAD中检出子目录或文件到特定的目录:

 git --work-tree=/path/to/outputdir checkout HEAD -- subdirname 

对于单个文件:

 git show HEAD:abspath/to/file > file.copy 

上面的解决scheme不适合我,因为我需要检查一个特定的标签树的版本。 顺便说一下,这就是cvs export的意图。 git checkout-index不接受标签参数,因为它从索引中检出文件。 git checkout <tag>会改变索引而不pipe工作树,所以我需要重置原来的树。 为我工作的解决scheme是克隆存储库。 共享克隆相当快,不占用太多空间。 如果需要,可以删除.git目录。

 git clone --shared --no-checkout <repository> <destination> cd <destination> git checkout <tag> rm -rf .git 

较新版本的git应该支持git clone --branch <tag>自动检出指定的标签:

 git clone --shared --branch <tag> <repository> <destination> rm -rf <destination>/.git 

如果您正在根据您的function进行工作,并且不想结账回主,您可以运行:

 git worktree add ../myrepo_master master 

它将创build../myrepo_master目录与master分支提交,在那里你可以继续工作

艾德里安的回答扔了“致命的:这个操作必须在工作树上运行”。 以下是我们的工作。

 git worktree add <new-dir> --no-checkout --detach cd <new-dir> git checkout <some-ref> -- <existing-dir> 

笔记:

  • --no-checkout不要签出任何东西到新的工作树上。
  • --detach不要为新工作树创build新的分支。
  • <some-ref>可以和任何ref一起工作,例如,它和HEAD~1工作。
  • git worktree prune

我定义了一个git别名来实现这个(在我发现这个问题之前)。

这是一个简短的bash函数,它保存当前path,切换到git仓库,做一个结帐并返回它开始的地方。

git checkto开发〜/ my_project_git

这例如将检查开发分支到“〜/ my_project_git”目录。

这是~/.gitconfig的别名代码:

 [alias] checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \ exit 1; [ -z \"$2\" ] && echo \"Need to specify target\ dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \ git checkout \"$1\"; cd \"$cDir\"; };f"