GIT: Checkout to a specific folder

匿名 (未验证) 提交于 2019-12-03 08:30:34

问题:

I want to use something similar to:

git checkout -- /

but I want to checkout the file to some folder I choose, rather than the overwriting the local /.

Any idea?

回答1:

As per Do a "git export" (like "svn export")?

You can use git checkout-index for that, this is a low level command, if you want to export everything, you can use -a,

git checkout-index -a -f --prefix=/destination/path/

To quote the man pages:

The final "/" [on the prefix] is important. The exported name is literally just prefixed with the specified string.

If you want to export a certain directory, there are some tricks involved. The command only takes files, not directories. To apply it to directories, use the 'find' command and pipe the output to git.

find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin

Also from the man pages:

Intuitiveness is not the goal here. Repeatability is.



回答2:

Another solution which is a bit cleaner - just specify a different work tree.

To checkout everything from your HEAD (not index) to a specific out directory:

git --work-tree=/path/to/outputdir checkout HEAD -- .

To checkout a subdirectory or file from your HEAD to a specific directory:

git --work-tree=/path/to/outputdir checkout HEAD -- subdirname


回答3:

For a single file:

git show HEAD:abspath/to/file > file.copy


回答4:

The above solutions didn't work for me because I needed to check out a specific tagged version of the tree. That's how cvs export is meant to be used, by the way. git checkout-index doesn't take the tag argument, as it checks out files from index. git checkout would change the index regardless of the work tree, so I would need to reset the original tree. The solution that worked for me was to clone the repository. Shared clone is quite fast and doesn't take much extra space. The .git directory can be removed if desired.

git clone --shared --no-checkout  cd  git checkout  rm -rf .git

Newer versions of git should support git clone --branch to check out the specified tag automatically:

git clone --shared --branch  rm -rf /.git


回答5:

If you're working under your feature and don't want to checkout back to master, you can run:

git worktree add ../myrepo_master master

It will create ../myrepo_master directory with master branch commits, where you can continue work



回答6:

Adrian's answer threw "fatal: This operation must be run in a work tree." The following is what worked for us.

git worktree add  --no-checkout --detach cd  git checkout  -- 

Notes:

  • --no-checkout Do not checkout anything into the new worktree.
  • --detach Do not create a new branch for the new worktree.
  • works with any ref, for instance, it works with HEAD~1.
  • Cleanup with git worktree prune.


回答7:

I defined an git alias to achieve just this (before I found this question).

It's a short bash function which saves the current path, switch to the git repo, does a checkout and return where it started.

git checkto develop ~/my_project_git

This e.g. would checkout the develop branch into "~/my_project_git" directory.

This is the alias code inside ~/.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"


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!