GIT: 签出到特定的文件夹

我想使用类似于:

git checkout -- <path>/<file>

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

知道吗?

203454 次浏览

根据 做一个“ git export”(像“ 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

手册中还有:

这里的目标不是直观性,而是可重复性。

对于单个文件:

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目录。

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

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

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

开发 ~/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"

如果您正在使用您的特性,并且不想退回到 master,那么您可以运行:

cd ./myrepo


git worktree add ../myrepo_master master


git worktree remove ../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 worktree prune

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

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

除了 @ Hasen 的回答。您可能想使用 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#