Git clone without .git directory

GitVersion ControlGit Clone

Git Problem Overview


Is there a flag to pass to git when doing a clone, say don't clone the .git directory? If not, how about a flag to delete the .git directory after the clone?

Git Solutions


Solution 1 - Git

Use

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • The depth option will make sure to copy the least bit of history possible to get that repo.
  • The branch option is optional and if not specified would get the default branch.
  • The second line will make your directory dirformynewrepo not a Git repository any more.
  • If you're doing recursive submodule clone, the depth and branch parameter don't apply to the submodules.

Solution 2 - Git

since you only want the files, you don't need to treat it as a git repo.

rsync -rlp --exclude '.git' user@host:path/to/git/repo/ .

and this only works with local path and remote ssh/rsync path, it may not work if the remote server only provides git:// or https:// access.

Solution 3 - Git

Alternatively, if you have Node.js installed, you can use the following command:

npx degit GIT_REPO

npx comes with Node, and it allows you to run binary node-based packages without installing them first (alternatively, you can first install degit globally using npm i -g degit).

Degit is a tool created by Rich Harris, the creator of Svelte and Rollup, which he uses to quickly create a new project by cloning a repository without keeping the git folder. But it can also be used to clone any repo once...

Solution 4 - Git

For those who doubt the --depth 1 solution because it still download the .git directory and you need to manually remove it afterward, maybe you need to know how git clone actually works.

When you normally clone a repo, git download all your files (spanning across commits) into the .git directory. When you clone with --depth 1, git only downloads the latest version of the files into .git. After that, git will checkout or retrieve those files from .git into the working directory (no more download).

And oftentimes, because the file objects inside .git is compressed, you will save more bandwidth by downloading the files with git clone --depth 1 rather than downloading the uncompressed files. And for some people with slow internet, that is worth the price (the need to run rm -rf).

I personally think the git archive solution is better but since it's not supported by GitHub, --depth 1 is the way to go.

Solution 5 - Git

git clone --separate-git-dir=$(mktemp -u) --depth=1 <repo> <dir> && rm <dir>/.git

I like this solution more because I don't like rm -rfing things automatically. It just rms a .git file, which means it could never accidentally rm -rf a wrong .git directory

It has a dependency on mktemp command so it'll work *nix systems (from what I see this needs further work for the mktemp to work on MacOS, so if anyone wants to comment a working solution I'll add it)

In zsh, I made that a function so I ensure a dir value is defined:

alias np='node-project'
function node-project() {
  dir=${1:-.}
  git clone --separate-git-dir=$(mktemp -u) --depth=1 <my-node-repo> $dir && rm $dir/.git
}

Explanation

The --separate-git-dir flag lets you specify a path for the .git directory. The resulting "project" will have a .git file (not a directory) whose content will be a single line:

gitdir: <the dir you specified in the flag>

Because we used a tmp dir with the mktemp command, the actual .git directory contents will end up in a tmp dir. We also use a --depth=1 so it takes less space on tmp dirs.

Solution 6 - Git

git archive --remote already implements this.

Solution 7 - Git

You can always do

git clone git://repo.org/fossproject.git && rm -rf fossproject/.git

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJustinView Question on Stackoverflow
Solution 1 - GitAdam DymitrukView Answer on Stackoverflow
Solution 2 - GitHuang TaoView Answer on Stackoverflow
Solution 3 - GitErik VullingsView Answer on Stackoverflow
Solution 4 - GitM Imam PratamaView Answer on Stackoverflow
Solution 5 - GiterandrosView Answer on Stackoverflow
Solution 6 - GitlpappView Answer on Stackoverflow
Solution 7 - Gituser529758View Answer on Stackoverflow