GIT:结帐到特定文件夹

问题描述 投票:106回答:9

我想使用类似的东西:

git checkout -- <path>/<file>

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

任何的想法?

git
9个回答
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

同样来自手册页:

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


189
投票

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

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

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

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

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

21
投票

对于单个文件:

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

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

10
投票

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

cd ./myrepo

git worktree add ../myrepo_master master

git worktree remove ../myrepo_master

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


4
投票

阿德里安的回答“致命:这项行动必须在工作树上进行。”以下是对我们有用的。

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清理。

0
投票

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

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

git checkout开发〜/我的项目git

这例如将check分支签入“〜/ 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"

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.