Re: fetch unshallow fails to honor dry-run

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks for including me. I thought I marked this for reply later but I did not..

On Mon, Nov 9, 2015 at 8:24 PM, Jeff King <peff@xxxxxxxx> wrote:
> [+cc Duy for shallow expertise]
>
> On Sun, Oct 25, 2015 at 10:16:00AM +0100, Tim Janik wrote:
>
>> git fetch --dry-run modifies the repository if --unshallow is passed:
>>
>> $ git --version
>> git version 2.1.4
>> $ git fetch --dry-run --unshallow
>> remote: Counting objects: 30603, done.
>> remote: Compressing objects: 100% (6843/6843), done.
>> remote: Total 30603 (delta 24564), reused 29164 (delta 23386)
>> Receiving objects: 100% (30603/30603), 5.42 MiB | 0 bytes/s, done.
>> Resolving deltas: 100% (24564/24564), completed with 317 local objects.
>> remote: Counting objects: 7, done.
>> remote: Compressing objects: 100% (7/7), done.
>> remote: Total 7 (delta 0), reused 6 (delta 0)
>> Unpacking objects: 100% (7/7), done.
>
> Hmm. I think that is because --dry-run is effectively "transfer the
> objects, but do not update refs". So by fetching the objects, we've
> effectively deepened the repository, whether we update the refs or not.
>
> That being said, I suspect nobody has really thought hard about the
> interaction of these two flags. And while obviously we update the
> object database with a dry-run fetch, I can see the reasoning that we
> should not touch the .git/shallow file, even if we have the objects.
>
> Naively, something like this patch might help, but I have no idea if it
> causes other problems.
>
> diff --git a/builtin/fetch.c b/builtin/fetch.c
> index 4ce4fa0..24aa331 100644
> --- a/builtin/fetch.c
> +++ b/builtin/fetch.c
> @@ -870,7 +870,7 @@ static struct transport *prepare_transport(struct remote *remote)
>                 set_option(transport, TRANS_OPT_KEEP, "yes");
>         if (depth)
>                 set_option(transport, TRANS_OPT_DEPTH, depth);
> -       if (update_shallow)
> +       if (update_shallow && !dry_run)
>                 set_option(transport, TRANS_OPT_UPDATE_SHALLOW, "yes");
>         return transport;
>  }

The key is not let shallow.c:update_shallow() do anything to
.git/shallow. --depth (or --unshallow) does not check this
UPDATE_SHALLOW flag and can still change .git/shallow. Other than
that, I don't think it can cause and bad effects. It's probably best
to pass this dry-run flag to transport.c
-- 
Duy
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]