我想使用类似于:
git checkout -- <path>/<file>
但是我想签出文件到我选择的某个文件夹,而不是覆盖本地 <path>/<file>。
<path>/<file>
知道吗?
根据 做一个“ git export”(像“ svn export”) ?
你可以使用 git checkout-index,这是一个低级的命令,如果你想导出一切,你可以使用 -a,
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
手册中还有:
这里的目标不是直观性,而是可重复性。
对于单个文件:
git show HEAD:abspath/to/file > file.copy
另一个解决方案,这是一个有点干净-只是指定一个不同的工作树。
检出从 HEAD (而非索引)到特定输出目录的所有内容:
git --work-tree=/path/to/outputdir checkout HEAD -- .
检出从 HEAD 到特定目录的子目录或文件:
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
上面的解决方案对我不起作用,因为我需要检查树的特定标记版本。顺便说一句,cvs export就是这么用的。git checkout-index不使用标记参数,因为它从 index 中检出文件。无论工作树是什么,git checkout <tag>都会改变索引,所以我需要重置原始树。对我有效的解决方案是克隆存储库。共享克隆速度相当快,并且不占用太多额外空间。如果需要,可以删除 .git目录。
cvs export
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 --branch <tag>
git clone --shared --branch <tag> <repository> <destination> rm -rf <destination>/.git
我定义了一个 git 别名来达到这个目的(在我发现这个问题之前)。
它是一个短 bash 函数,可以保存当前路径,切换到 git repo,执行结帐并返回开始的位置。
开发 ~/my _ project _ git
例如,将开发分支签出到“ ~/my _ project _ git”目录。
这是 ~/.gitconfig中的别名代码:
~/.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"
如果您正在使用您的特性,并且不想退回到 master,那么您可以运行:
cd ./myrepo git worktree add ../myrepo_master master git worktree remove ../myrepo_master
它将使用 master分支提交创建 ../myrepo_master目录,在这里您可以继续工作
master
../myrepo_master
阿德里安的回答是“致命的: 这个操作必须在工作树中运行。”。
git worktree add <new-dir> --no-checkout --detach cd <new-dir> git checkout <some-ref> -- <existing-dir>
备注:
<some-ref>
HEAD~1
git worktree prune
我使用这个别名来签出临时目录中的一个分支:
[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 archive branch-index | tar -x -C your-folder-on-PC克隆一个分支到另一个文件夹。我认为,然后你可以复制任何你需要的文件
git archive branch-index | tar -x -C your-folder-on-PC
除了 @ Hasen 的回答。您可能想使用 git ls-files而不是 find来列出文件到 退房,比如:
git ls-files
find
git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
git ls-files忽略未提交的文件。
如果你在 mydir工作,为什么不简单地 cp -r mydir mydir2,然后 cd mydir2; git checkout commit#
mydir
cp -r mydir mydir2
cd mydir2; git checkout commit#