threads / patch / 12978

patchgit-clone.txt: Adjust note to --shared for new pruning behavior of git-gc

Subject: [PATCH] git-clone.txt: Adjust note to --shared for new pruning behavior of git-gc

## tl;dr

6 messages between Apr 3, 2008 and Apr 4, 2008. Diffs are folded; open one to read it.

replies: 5people: 3as markdown or json

Brandon Casey· Apr 3, 2008, 18:26 UTC · lore

Since git-gc now always calls prune, even with --auto, unreferenced objects may be removed by more operations than just git-gc. This is important for clones created using --shared or --reference.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
---
 Documentation/git-clone.txt |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)
Show changes to Documentation/git-clone.txt +8 −4
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
index 9758243..d3ab00b 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -65,10 +65,12 @@ OPTIONS
 +
 *NOTE*: this is a possibly dangerous operation; do *not* use
 it unless you understand what it does. If you clone your
-repository using this option, then delete branches in the
-source repository and then run linkgit:git-gc[1] using the
-'--prune' option in the source repository, it may remove
-objects which are referenced by the cloned repository.
+repository using this option and then delete branches in the
+source repository, some objects may become unreferenced (or dangling).
+These objects may be removed by normal git operations (such as git-commit[1])
+which automatically call git-gc[1]. If these objects are removed and
+were referenced by the cloned repository, then the cloned repository
+will become corrupt.
 
 
 
@@ -79,6 +81,8 @@ objects which are referenced by the cloned repository.
 	an already existing repository as an alternate will
 	require fewer objects to be copied from the repository
 	being cloned, reducing network and local storage costs.
++
+*NOTE*: see NOTE to --shared option.
 
 --quiet::
 -q::
-- 
1.5.5.rc3
Johannes Schindelin· Apr 3, 2008, 19:14 UTC · re: Brandon Casey · lore

Re: [PATCH] git-clone.txt: Adjust note to --shared for new pruning behavior of git-gc

Hi,
On Thu, 3 Apr 2008, Brandon Casey wrote:
Show 18 quoted lines
> diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
> index 9758243..d3ab00b 100644
> --- a/Documentation/git-clone.txt
> +++ b/Documentation/git-clone.txt
> @@ -65,10 +65,12 @@ OPTIONS
>  +
>  *NOTE*: this is a possibly dangerous operation; do *not* use
>  it unless you understand what it does. If you clone your
> -repository using this option, then delete branches in the
> -source repository and then run linkgit:git-gc[1] using the
> -'--prune' option in the source repository, it may remove
> -objects which are referenced by the cloned repository.
> +repository using this option and then delete branches in the
> +source repository, some objects may become unreferenced (or dangling).
> +These objects may be removed by normal git operations (such as git-commit[1])
> +which automatically call git-gc[1]. If these objects are removed and
> +were referenced by the cloned repository, then the cloned repository
> +will become corrupt.

Please note that if you delete a branch _after_ running git-gc, the next git-gc would remove those objects anyway, since the first git-gc packed the objects, and they were therefore no longer dangling.

So it was an issue before the new git-gc behaviour anyway.

Ciao, Dscho

Brandon Casey· Apr 3, 2008, 20:51 UTC · re: Johannes Schindelin · lore

Re: [PATCH] git-clone.txt: Adjust note to --shared for new pruning behavior of git-gc

Johannes Schindelin wrote:
Show 26 quoted lines
> Hi,
> 
> On Thu, 3 Apr 2008, Brandon Casey wrote:
> 
>> diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
>> index 9758243..d3ab00b 100644
>> --- a/Documentation/git-clone.txt
>> +++ b/Documentation/git-clone.txt
>> @@ -65,10 +65,12 @@ OPTIONS
>>  +
>>  *NOTE*: this is a possibly dangerous operation; do *not* use
>>  it unless you understand what it does. If you clone your
>> -repository using this option, then delete branches in the
>> -source repository and then run linkgit:git-gc[1] using the
>> -'--prune' option in the source repository, it may remove
>> -objects which are referenced by the cloned repository.
>> +repository using this option and then delete branches in the
>> +source repository, some objects may become unreferenced (or dangling).
>> +These objects may be removed by normal git operations (such as git-commit[1])
>> +which automatically call git-gc[1]. If these objects are removed and
>> +were referenced by the cloned repository, then the cloned repository
>> +will become corrupt.
> 
> Please note that if you delete a branch _after_ running git-gc, the next 
> git-gc would remove those objects anyway, since the first git-gc packed 
> the objects, and they were therefore no longer dangling.

I thought they would be retained unless --prune was used. git-gc uses the -A option to repack when --prune is not used and -a when --prune is used.

I think even with the new prune behavior they would still be retained as long as they were packed since the prune only affects loose objects.

> So it was an issue before the new git-gc behaviour anyway.

Well, I thought that git-gc had become "safe" with respect to --shared repositories ever since the call to repack started using -A when --prune was not used.

Now it is unsafe again. But what I was really trying to point out in the documentation changes was that now _other_ commands such as git-commit are also unsafe since they call 'git-gc --auto' and could cause loose unreferenced objects to be deleted. So it is not enough to just avoid calling git-gc when dealing with a --shared repository.

-brandon
Johannes Schindelin· Apr 3, 2008, 20:01 UTC · re: Brandon Casey · lore

Re: [PATCH] git-clone.txt: Adjust note to --shared for new pruning behavior of git-gc

Hi,
On Thu, 3 Apr 2008, Brandon Casey wrote:
Show 29 quoted lines
> Johannes Schindelin wrote:
> 
> > On Thu, 3 Apr 2008, Brandon Casey wrote:
> > 
> >> diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
> >> index 9758243..d3ab00b 100644
> >> --- a/Documentation/git-clone.txt
> >> +++ b/Documentation/git-clone.txt
> >> @@ -65,10 +65,12 @@ OPTIONS
> >>  +
> >>  *NOTE*: this is a possibly dangerous operation; do *not* use
> >>  it unless you understand what it does. If you clone your
> >> -repository using this option, then delete branches in the
> >> -source repository and then run linkgit:git-gc[1] using the
> >> -'--prune' option in the source repository, it may remove
> >> -objects which are referenced by the cloned repository.
> >> +repository using this option and then delete branches in the
> >> +source repository, some objects may become unreferenced (or dangling).
> >> +These objects may be removed by normal git operations (such as git-commit[1])
> >> +which automatically call git-gc[1]. If these objects are removed and
> >> +were referenced by the cloned repository, then the cloned repository
> >> +will become corrupt.
> > 
> > Please note that if you delete a branch _after_ running git-gc, the next 
> > git-gc would remove those objects anyway, since the first git-gc packed 
> > the objects, and they were therefore no longer dangling.
> 
> I thought they would be retained unless --prune was used. git-gc uses the
> -A option to repack when --prune is not used and -a when --prune is used.
Oh, you're right.  I forgot.
Show 5 quoted lines
> But what I was really trying to point out in the documentation changes 
> was that now _other_ commands such as git-commit are also unsafe since 
> they call 'git-gc --auto' and could cause loose unreferenced objects to 
> be deleted. So it is not enough to just avoid calling git-gc when 
> dealing with a --shared repository.

Right. Hmm. I missed that completely when I thought about prune --expire.

Sorry, Dscho

Jakub Narebski· Apr 4, 2008, 06:49 UTC · re: Johannes Schindelin · lore

Re: [PATCH] git-clone.txt: Adjust note to --shared for new pruning behavior of git-gc

Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
Show 9 quoted lines
> On Thu, 3 Apr 2008, Brandon Casey wrote:
> > But what I was really trying to point out in the documentation changes 
> > was that now _other_ commands such as git-commit are also unsafe since 
> > they call 'git-gc --auto' and could cause loose unreferenced objects to 
> > be deleted. So it is not enough to just avoid calling git-gc when 
> > dealing with a --shared repository.
> 
> Right.  Hmm.  I missed that completely when I thought about prune 
> --expire.

I think that if you are using repository from which other repos borrow objects via alternates, it is a good idea to turn off automatic repacking with "git gc --auto" by setting gc.auto to 0 (or, hopefully, "never" or "false").

-- 
Jakub Narebski
Poland
ShadeHawk on #git
Brandon Casey· Apr 4, 2008, 14:25 UTC · re: Jakub Narebski · lore

Re: [PATCH] git-clone.txt: Adjust note to --shared for new pruning behavior of git-gc

Jakub Narebski wrote:
Show 14 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> 
>> On Thu, 3 Apr 2008, Brandon Casey wrote:
>>> But what I was really trying to point out in the documentation changes 
>>> was that now _other_ commands such as git-commit are also unsafe since 
>>> they call 'git-gc --auto' and could cause loose unreferenced objects to 
>>> be deleted. So it is not enough to just avoid calling git-gc when 
>>> dealing with a --shared repository.
>> Right.  Hmm.  I missed that completely when I thought about prune 
>> --expire.
> 
> I think that if you are using repository from which other repos borrow
> objects via alternates, it is a good idea to turn off automatic
> repacking with "git gc --auto" by setting gc.auto to 0

Either that or disable only the automatic pruning by setting gc.pruneexpire to never.

> (or, hopefully, "never" or "false").

I think those only work for dates and booleans respectively. gc.auto is parsed as an int.

-brandon

← back to recent threads