Re: how to reduce disk usage for large .git dirs?
- From
- Roger Gammans <roger@gammascience.co.uk>
- Date
- Nov 13, 2014, 12:02 UTC
- Message-ID
- <1415880149.4825.43.camel@knuth.computer-surgery.co.uk>
- In-Reply-To
- <20141113111444.GA15503@aepfle.de>
On Thu, 2014-11-13 at 12:14 +0100, Olaf Hering wrote:
Show 24 quoted lines
> How can I reduce the disk usage for multiple copies of the same repo? > > Up to now I just made copies like this, but since .git alone is already > 2GB it becomes expensive: > > # git clone git://host/repo.git repo-master > # cp -a repo-master repo-branchA > # cd repo-branchA > # git checkout -b branchA origin/branchA > # cd - > # cp -a repo-master repo-branchB > # cd repo-branchB > # git checkout -b branchB origin/branchB > # cd - > # cp -a repo-master repo-branchB-feature > # cd repo-branchB-feature > # git checkout -b branchB-feature origin/branchB > # cd - > > > Since each .git is almost identical I wonder if there is a reliable way > to "share" it. The "git clone" man page mentions --shared as a dangerous > way to do things. It does not give an advice how to manage such cloned > trees.
But you're not using clone you are using cp .
The clone man page also says this:-
--local, -l
When the repository to clone from is on a local machine, this flag bypasses the normal "Git aware" transport
mechanism and clones the repository by making a copy of HEAD and everything under objects and refs directories. The
files under .git/objects/ directory are hardlinked to save space when possible. If the repository is specified as a local path (e.g., /path/to/repo), this is the default, and --local is essentially
a no-op. If the repository is specified as a URL, then this flag is ignored (and we never use the local
optimizations). Specifying --no-local will override the default when /path/to/repo is given, using the regular Git
transport instead.Note the first sentence of the second paragraph. eg: # git clone git://host/repo.git repo-master # git clone repo-master repo-branchA # cd repo-branchA # git checkout -b branchA origin/branchA # cd - # git clone repo-master repo-branchB # cd repo-branchB # git checkout -b branchB origin/branchB # cd - # git clone repo-master repo-branchB-feature # cd repo-branchB-feature # git checkout -b branchB-feature origin/branchB # cd -
Should work better for you. And there is probably a way to do it less commands too.
-- Roger Gammans <roger@gammascience.co.uk>