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?
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?
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.
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 For a single file:
git show HEAD:abspath/to/file > file.copy 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 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
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.git worktree prune. 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"