From: Jens Lehmann <Jens.Lehmann@web.de>
To: Patrick Steinhardt <ps@pks.im>
Cc: Jonathan Nieder <jrnieder@gmail.com>,
git@vger.kernel.org, Heiko Voigt <hvoigt@hvoigt.net>
Subject: Re: [RFC] git submodule purge
Date: Wed, 25 Mar 2015 20:47:59 +0100 [thread overview]
Message-ID: <551310EF.8050700@web.de> (raw)
In-Reply-To: <20150325090631.GA370@pks-pc.localdomain>
Am 25.03.2015 um 10:06 schrieb Patrick Steinhardt:
> On Mon, Mar 23, 2015 at 10:32:27PM +0100, Jens Lehmann wrote:
>> Am 17.03.2015 um 08:56 schrieb Patrick Steinhardt:
>>> On Mon, Mar 16, 2015 at 01:03:53PM -0700, Jonathan Nieder wrote:
>>>> (+cc: Jens and Heiko, submodule experts)
>>>> Hi,
>>>>
>>>> Patrick Steinhardt wrote:
>>>>
>>>>> This proposal is just for discussion. If there is any interest I
>>>>> will implement the feature and send some patches.
>>>>>
>>>>> Currently it is hard to properly remove submodules. That is when
>>>>> a submodule is deinitialized and removed from a repository the
>>>>> directory '.git/modules/<SM_NAME>' will still be present and
>>>>> there is no way to remove it despite manually calling `rm` on it.
>>>>> I think there should be a command that is able to remove those
>>>>> dangling repositories if the following conditions are met:
>>>>>
>>>>> - the submodule should not be initialized
>>>>>
>>>>> - the submodule should not have an entry in .gitmodules in the
>>>>> currently checked out revision
>>>>>
>>>>> - the submodule should not contain any commits that are not
>>>>> upstream
>>>>>
>>>>> - the submodule should not contain other submodules that do not
>>>>> meet those conditions
>>>>>
>>>>> This would ensure that it is hard to loose any commits that may
>>>>> be of interest. In the case that the user knows what he is doing
>>>>> we may provide a '--force' switch to override those checks.
>>>>
>>>> Those conditions look simultaneously too strong and too weak. ;-)
>>>>
>>>> In principle, it should be safe to remove .git/modules/<name> as
>>>> long as
>>>>
>>>> (1) it (and its submodules, sub-sub-modules, etc) doesn't have any
>>>> un-pushed local commits.
>>>>
>>>> (2) it is not being referred to by a .git file in the work tree of
>>>> the parent repository.
>>>>
>>>> Condition (1) can be relaxed if the user knows what they are losing
>>>> and is okay with that. Condition (2) can be avoided by removing
>>>> (de-initing) the copy of that submodule in the worktree at the same
>>>> time.
>>>>
>>>> The functionality sounds like a useful thing to have, whether as an
>>>> option to 'git submodule deinit' or as a new subcommand. In the long
>>>> term I would like it to be possible to do everything 'git submodule'
>>>> can do using normal git commands instead of that specialized
>>>> interface. What command do you think this would eventually belong in?
>>>> (An option to "git gc", maybe?)
>>>>
>>>> Thanks,
>>>> Jonathan
>>>
>>> Thanks for your feedback.
>>>
>>> Considering that purging the submodule is tightly coupled with
>>> de-initializing it, it might make sense to provide this
>>> functionality as part of `git submodule deinit`. Maybe something
>>> like `git submodule deinit --purge` would work for the user.
>>> Problem is if the user first removes the submodule and does not
>>> first deinitialize it he is not able to purge the repository
>>> afterwards as deinit will complain about the submodule not being
>>> matched anymore. We could just make `deinit --purge` work with
>>> removed submodules, but that does not feel very natural to me.
>>
>> Hmm, cmd_deinit() seems to cope with submodules removed by the
>> user just fine (as long as they are still present in the index).
>> To me it feels natural to extend deinit to remove the repo from
>> .git/modules too when --purge is given (as long as no unpushed
>> commits are present or -f is given).
>>
>>> `git gc` feels saner in that regard, but I don't think it would
>>> be easy to spot for users as this command is in general not used
>>> very frequently by them. One could argue though that it does not
>>> need to be discoverable.
>>
>> The error message of "git submodule deinit --purge" for a
>> submodule that isn't recorded in the index anymore could point
>> the user to the appropriate gc command. But how do we tell gc
>> which submodule it should purge? "--purge=<submodule-name>"
>> maybe?
>
> This might work, but at least the option would need to provide a
> hint to the user that it has something to do with submodules. So
> if the feature was implemented by `git gc` I'd rather name the
> parameter "--purge-submodule=<submodule-name>" which in my
> opinion clearly states its intention, even though it is longer to
> type. But with working bash-completion this should be non-issue,
> especially as this command would not need to be run frequently.
Agreed.
> That said, I think by now I agree with the common (?) opinion
> that the command is best placed in `git submodule deinit --purge`
> and I will likely implement it there.
Me thinks that makes sense. But be aware that this will only work
for those submodules that are still present in the current index.
> Optionally I could
> implement `git gc --purge-submodule=<submodule-name>` as a second
> way to access the feature so that we have a way of purging them
> without using the submodules-interface. I doubt though that this
> will provide much of a benefit as the user still has to be aware
> that he is working with submodules as he has to provide the
> `--purge-submodule` option, so there is not much to be gained by
> this.
Hmm, I still believe cleaning up a submodule repo which is already
deinited makes sense. Using 'rm -rf .git/modules/<submodulename>'
will work just fine, but is missing any safeguards. The deinit
command takes submodule paths, not submodule names. So it looks
to me like 'git gc --purge-submodule=<submodule-name>' would make
sense here (and this command should check that the submodule has
already been deinited and fail otherwise telling the user so).
next prev parent reply other threads:[~2015-03-25 19:48 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-16 13:44 [RFC] git submodule purge Patrick Steinhardt
2015-03-16 15:55 ` Junio C Hamano
2015-03-17 8:18 ` Patrick Steinhardt
2015-03-17 8:25 ` Fredrik Gustafsson
2015-03-16 20:03 ` Jonathan Nieder
2015-03-17 7:56 ` Patrick Steinhardt
2015-03-23 21:32 ` Jens Lehmann
2015-03-25 9:06 ` Patrick Steinhardt
2015-03-25 19:47 ` Jens Lehmann [this message]
2015-03-26 13:30 ` Patrick Steinhardt
2015-03-26 21:48 ` Jens Lehmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=551310EF.8050700@web.de \
--to=jens.lehmann@web.de \
--cc=git@vger.kernel.org \
--cc=hvoigt@hvoigt.net \
--cc=jrnieder@gmail.com \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.