GIT:结帐到特定文件夹

时间:2010-12-18 20:17:44

标签: git

我想使用类似的东西:

git checkout -- <path>/<file>

但我想将文件签出到我选择的某个文件夹,而不是覆盖本地<path>/<file>

有什么想法吗?

10 个答案:

答案 0 :(得分:190)

另一个更清洁的解决方案 - 只需指定一个不同的工作树。

要检查从HEAD(非索引)到特定目录的所有内容:

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

将HEAD中的子目录或文件签出到特定目录:

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

答案 1 :(得分:47)

根据Do a "git export" (like "svn export")?

您可以使用git checkout-index,这是一个低级命令,如果要导出所有内容,可以使用-a

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

引用手册页:

  

最后的“/”[在前缀上]很重要。导出的名称实际上只是以指定的字符串为前缀。

如果要导出某个目录,则涉及一些技巧。该命令只接受文件,而不是目录。要将其应用于目录,请使用“find”命令并将输出传递给git。

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

同样来自手册页:

  

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

答案 2 :(得分:22)

对于单个文件:

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

答案 3 :(得分:17)

以上解决方案对我不起作用,因为我需要检查树的特定标记版本。顺便说一下,这就是cvs export的意思。 git checkout-index不接受tag参数,因为它从index中检出文件。无论工作树如何,git checkout <tag>都会更改索引,因此我需要重置原始树。对我有用的解决方案是克隆存储库。共享克隆非常快,并且不会占用太多空间。如果需要,可以删除.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

答案 4 :(得分:10)

如果您在自己的功能下工作但不想结帐回主人,则可以运行:

cd ./myrepo

git worktree add ../myrepo_master master

git worktree remove ../myrepo_master

它将使用../myrepo_master分支提交创建master目录,您可以继续工作

答案 5 :(得分:4)

Adrian的回答引起了致命:此操作必须在工作树中运行。&#34;以下是对我们有用的。

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

注意:

  • --no-checkout不要将任何内容签出到新的工作树中。
  • --detach不要为新工作树创建新分支。
  • <some-ref>适用于任何参考,例如,它适用于HEAD~1
  • 使用git worktree prune进行清理。

答案 6 :(得分:1)

添加到@hasen's answer。要将文件列出到checkout,您可能需要使用git ls-files而不是find,例如:

git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin

答案 7 :(得分:0)

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

这是一个短的bash函数,可以保存当前路径,切换到git repo,执行checkout并返回它开始的位置。

  

git checkto develop~ / 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"

答案 8 :(得分:0)

我正在使用此别名检出临时目录中的分支:

[alias]
    cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory

用法:

git cot mybranch

然后将您放在临时目录中的新shell中,您可以在该目录中处理分支。你甚至可以在这个目录中使用git命令。

完成后,删除目录并运行:

git worktree prune

在添加新工作树之前,这也会在别名中自动完成。

答案 9 :(得分:0)

使用git archive branch-index | tar -x -C your-folder-on-PC将分支克隆到另一个文件夹。我想,那么您可以复制所需的任何文件