GIT:签出到一个特定的文件夹
我想用类似的东西:
git checkout -- <path>/<file>
但我想签出文件到我select的某个文件夹,而不是覆盖本地/。
任何想法?
按照“git export”(如“svn export”)?
你可以使用git checkout-index
,这是一个低级命令,如果你想导出所有的东西,你可以使用-a
,
git checkout-index -a -f --prefix=/destination/path/
引用手册页:
最后的“/”(在前缀上)很重要。 导出的名称实际上只是以指定的string作为前缀。
如果你想导出一个特定的目录,有一些技巧。 该命令只需要文件,而不是目录。 要将其应用于目录,请使用“find”命令并将输出传递给git。
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
另外从手册页:
直觉性不是这里的目标。 重复性是。
另一个更清洁的解决scheme – 只需指定一个不同的工作树。
要检查从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
上面的解决scheme不适合我,因为我需要检查一个特定的标签树的版本。 顺便说一下,这就是cvs export
的意图。 git checkout-index
不接受标签参数,因为它从索引中检出文件。 git checkout <tag>
会改变索引而不pipe工作树,所以我需要重置原来的树。 为我工作的解决scheme是克隆存储库。 共享克隆相当快,不占用太多空间。 如果需要,可以删除.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
如果您正在根据您的function进行工作,并且不想结账回主,您可以运行:
git worktree add ../myrepo_master master
它将创build../myrepo_master
目录与master
分支提交,在那里你可以继续工作
艾德里安的回答扔了“致命的:这个操作必须在工作树上运行”。 以下是我们的工作。
git worktree add <new-dir> --no-checkout --detach cd <new-dir> git checkout <some-ref> -- <existing-dir>
笔记:
-
--no-checkout
不要签出任何东西到新的工作树上。 -
--detach
不要为新工作树创build新的分支。 -
<some-ref>
可以和任何ref一起工作,例如,它和HEAD~1
工作。 - 用
git worktree prune
。
我定义了一个git别名来实现这个(在我发现这个问题之前)。
这是一个简短的bash函数,它保存当前path,切换到git仓库,做一个结帐并返回它开始的地方。
git checkto开发〜/ 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"