我想使用类似的东西:
git checkout -- <path>/<file>
但我想将文件签出到我选择的某个文件夹,而不是覆盖本地<path>/<file>
。
有什么想法吗?
答案 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
将分支克隆到另一个文件夹。我想,那么您可以复制所需的任何文件