GIT:结帐到特定文件夹

Raf*_*fid 117 git

我想使用类似的东西:

git checkout -- <path>/<file>
Run Code Online (Sandbox Code Playgroud)

但我想将文件签出到我选择的某个文件夹,而不是覆盖本地/.

任何的想法?

Adr*_*eil 204

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

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

git --work-tree=/path/to/outputdir checkout HEAD -- .
Run Code Online (Sandbox Code Playgroud)

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

git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
Run Code Online (Sandbox Code Playgroud)

  • 它的工作原理是有望与老款太多(如给一个SHA到位HEAD的),然而`git的status`然后显示了很多MODS的(大概是因为目前该指数相匹配的其他目录,而没有触及正常工作树).`git reset`让它恢复到良好状态. (9认同)
  • 仅供参考:您需要自己创建目录,否则会出现此错误:`fatal:此操作必须在工作树中运行 (9认同)
  • **这会对主要工作树的索引进行灾难性的修改,**这通常很糟糕.正如@TomGoodfellow建议的那样,`git reset`足以将主要工作树恢复到理智状态.要在任何SHA1,分支或标记*上安全地导出存储库子目录而不*修改主工作树,请参阅[Charles Bailey](/sf/users/1369441/)[臭名昭着的`git archive`溶液](/sf/answers/11463861/).同样,为了安全地同时检出多个分支,新的`git worktree add`子命令是你的朋友. (9认同)
  • 小注 - 你确实需要一个绝对路径,因为没有发生shell代码扩展,即`--work-tree =/home/thomasg/okcopy`而不是`--work-tree =〜/ okcopy`(可能使用了坐在同一个git树里面的相对路径也有效,但那种方式就是R'lyehian的疯狂和'git status`输出 (4认同)
  • 同样在这里`git status`显示了很多mod,而`git reset`没有帮助.我不得不'git checkout -f HEAD`来恢复我的回购状态. (2认同)

has*_*sen 51

根据Do"git export"(如"svn export")?

你可以使用git checkout-index它,这是一个低级命令,如果你想导出所有东西,你可以使用-a,

git checkout-index -a -f --prefix=/destination/path/
Run Code Online (Sandbox Code Playgroud)

引用手册页:

最后的"/"[在前缀上]很重要.导出的名称实际上只是以指定的字符串为前缀.

如果要导出某个目录,则涉及一些技巧.该命令只接受文件,而不是目录.要将其应用于目录,请使用"find"命令并将输出传递给git.

find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
Run Code Online (Sandbox Code Playgroud)

同样来自手册页:

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

  • 如果你想检出一个裸 git 仓库的分支/提交,使用 `GIT_WORK_TREE=../path/to/place git checkout` (2认同)
  • `git worktree`(见下文)imho是今天的规范答案,可能会在这里添加. (2认同)

Tob*_*obu 24

对于单个文件:

git show HEAD:abspath/to/file > file.copy
Run Code Online (Sandbox Code Playgroud)

  • +1并澄清"某些先前提交"(而不是HEAD):它指的是可以通过`gitk`轻松找到的`SHA1 ID`.如果我只需要将该文件"签出"到临时位置(即不回复),那么我将使用`show`子命令:`git show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt> myproj_mapping.txt` (2认同)

pro*_*ski 19

上述解决方案对我不起作用,因为我需要查看树的特定标记版本.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
Run Code Online (Sandbox Code Playgroud)

较新版本的git应支持git clone --branch <tag>自动检出指定的标记:

git clone --shared --branch <tag> <repository> <destination>
rm -rf <destination>/.git
Run Code Online (Sandbox Code Playgroud)

  • `git --work-tree =/path/to/outputdir checkout <tag> - .`对你不起作用? (3认同)

its*_*lay 15

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

cd ./myrepo

git worktree add ../myrepo_master master

git worktree remove ../myrepo_master
Run Code Online (Sandbox Code Playgroud)

它将创建../myrepo_master具有master分支提交的目录,您可以在其中继续工作

  • 最佳答案 - 简单,与 `git --work-tree=/path/to/outputdir checkout HEAD -- 不同,它不对索引做任何事情,只是将选定的分支复制到指定位置(加上.git 文件)。 (3认同)
  • 撤消此操作是工作树中的子命令:`git worktree remove ../myrepo_master` (2认同)

Sha*_*tin 5

Adrian的回答是“致命的:此操作必须在工作树中运行”。以下是对我们有用的。

git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>
Run Code Online (Sandbox Code Playgroud)

笔记:

  • --no-checkout 不要将任何内容签出到新的工作树中。
  • --detach 不要为新的工作树创建新的分支。
  • <some-ref>例如,可与任何ref一起使用HEAD~1
  • 使用清理git worktree prune