我想使用类似的东西:
git checkout -- <path>/<file>
但我想将文件签出到我选择的某个文件夹,而不是覆盖当地的<path>/<file>
。
任何的想法?
根据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
同样来自手册页:
直觉不是这里的目标。重复性是。
另一个更清洁的解决方案 - 只需指定一个不同的工作树。
要检查从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
上述解决方案对我不起作用,因为我需要查看树的特定标记版本。顺便说一句,这就是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
如果您在您的功能下工作并且不想结帐回主人,则可以运行:
cd ./myrepo
git worktree add ../myrepo_master master
git worktree remove ../myrepo_master
它将使用../myrepo_master
分支提交创建master
目录,您可以继续工作
阿德里安的回答“致命:这项行动必须在工作树上进行。”以下是对我们有用的。
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
清理。我定义了一个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"
我正在使用此别名来检出临时目录中的分支:
[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
在添加新工作树之前,这也会在别名中自动完成。
使用git archive branch-index | tar -x -C your-folder-on-PC
将分支克隆到另一个文件夹。我想,那么你可以复制你需要的任何文件