* [PATCH 0/2] contrib/subtree: Add -S/-gpg-sign @ 2025-06-02 16:40 Patrik Weiskircher via GitGitGadget 2025-06-02 16:40 ` [PATCH 1/2] contrib/subtree: parse using --stuck-long Patrik Weiskircher via GitGitGadget ` (2 more replies) 0 siblings, 3 replies; 12+ messages in thread From: Patrik Weiskircher via GitGitGadget @ 2025-06-02 16:40 UTC (permalink / raw) To: git; +Cc: apenwarr, Junio C Hamano, Patrik Weiskircher This patch adds support for the -S/--gpg-sign option to the git subtree command. Currently, git subtree creates squash and merge commits without applying GPG signatures, even when commit signing is configured via commit.gpgSign. This causes issues in repositories that require signed commits for policy reasons. The implementation ensures that -S/--gpg-sign behaves consistently with other Git commands, passing the flag through to git commit-tree and git merge where appropriate. This change improves compatibility with workflows and repositories that enforce signed commits. Changes have been made to this patch according to a discussion with Junio C Hamano gitster@pobox.com on my previous patch attempt. Patrik Weiskircher (2): contrib/subtree: parse using --stuck-long contrib/subtree: add -S/--gpg-sign contrib/subtree/git-subtree.adoc | 19 +++-- contrib/subtree/git-subtree.sh | 66 ++++++++--------- contrib/subtree/t/t7900-subtree.sh | 113 +++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 40 deletions(-) base-commit: 7014b55638da979331baf8dc31c4e1d697cf2d67 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1928%2Fpweiskircher%2Fsubtree-sign-the-second-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1928/pweiskircher/subtree-sign-the-second-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/1928 -- gitgitgadget ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/2] contrib/subtree: parse using --stuck-long 2025-06-02 16:40 [PATCH 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget @ 2025-06-02 16:40 ` Patrik Weiskircher via GitGitGadget 2025-06-03 20:42 ` D. Ben Knoble 2025-06-02 16:40 ` [PATCH 2/2] contrib/subtree: add -S/--gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget 2 siblings, 1 reply; 12+ messages in thread From: Patrik Weiskircher via GitGitGadget @ 2025-06-02 16:40 UTC (permalink / raw) To: git; +Cc: apenwarr, Junio C Hamano, Patrik Weiskircher, Patrik Weiskircher From: Patrik Weiskircher <patrik@pspdfkit.com> -S/--gpg-sign requires an optional parameter. Optional parameter handling only works unambiguous with git rev-parse --parseopt when using the --stuck-long option. Signed-off-by: Patrik Weiskircher <patrik@pspdfkit.com> --- contrib/subtree/git-subtree.sh | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index 15ae86db1b27..60b2431b8bba 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -115,7 +115,7 @@ main () { then set -- -h fi - set_args="$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)" + set_args="$(echo "$OPTS_SPEC" | git rev-parse --parseopt --stuck-long -- "$@" || echo exit $?)" eval "$set_args" . git-sh-setup require_work_tree @@ -131,9 +131,6 @@ main () { opt="$1" shift case "$opt" in - --annotate|-b|-P|-m|--onto) - shift - ;; --rejoin) arg_split_rejoin=1 ;; @@ -177,42 +174,37 @@ main () { shift case "$opt" in - -q) + --quiet) arg_quiet=1 ;; - -d) + --debug) arg_debug=1 ;; - --annotate) + --annotate=*) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" - arg_split_annotate="$1" - shift + arg_split_annotate="${opt#*=}" ;; --no-annotate) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" arg_split_annotate= ;; - -b) + --branch=*) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" - arg_split_branch="$1" - shift + arg_split_branch="${opt#*=}" ;; - -P) - arg_prefix="${1%/}" - shift + --prefix=*) + arg_prefix="${opt#*=}" ;; - -m) + --message=*) test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command" - arg_addmerge_message="$1" - shift + arg_addmerge_message="${opt#*=}" ;; --no-prefix) arg_prefix= ;; - --onto) + --onto=*) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" - arg_split_onto="$1" - shift + arg_split_onto="${opt#*=}" ;; --no-onto) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" -- gitgitgadget ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] contrib/subtree: parse using --stuck-long 2025-06-02 16:40 ` [PATCH 1/2] contrib/subtree: parse using --stuck-long Patrik Weiskircher via GitGitGadget @ 2025-06-03 20:42 ` D. Ben Knoble 2025-06-04 13:56 ` Patrik Weiskircher 0 siblings, 1 reply; 12+ messages in thread From: D. Ben Knoble @ 2025-06-03 20:42 UTC (permalink / raw) To: Patrik Weiskircher via GitGitGadget Cc: git, apenwarr, Junio C Hamano, Patrik Weiskircher On Mon, Jun 2, 2025 at 12:41 PM Patrik Weiskircher via GitGitGadget <gitgitgadget@gmail.com> wrote: > > From: Patrik Weiskircher <patrik@pspdfkit.com> > > -S/--gpg-sign requires an optional parameter. Optional parameter > handling only works unambiguous with git rev-parse --parseopt when using > the --stuck-long option. Here we mention "-S", but that flag isn't implemented yet, right? Perhaps something like: Optional parameter handling only works unambiguous with git rev-parse --parseopt when using the --stuck-long option. To prepare for future commits which add flags with optional parameters, parse with --stuck-long. > > Signed-off-by: Patrik Weiskircher <patrik@pspdfkit.com> > --- > contrib/subtree/git-subtree.sh | 34 +++++++++++++--------------------- > 1 file changed, 13 insertions(+), 21 deletions(-) > > diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh > index 15ae86db1b27..60b2431b8bba 100755 > --- a/contrib/subtree/git-subtree.sh > +++ b/contrib/subtree/git-subtree.sh > @@ -115,7 +115,7 @@ main () { > then > set -- -h > fi > - set_args="$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)" > + set_args="$(echo "$OPTS_SPEC" | git rev-parse --parseopt --stuck-long -- "$@" || echo exit $?)" > eval "$set_args" > . git-sh-setup > require_work_tree > @@ -131,9 +131,6 @@ main () { > opt="$1" > shift > case "$opt" in > - --annotate|-b|-P|-m|--onto) > - shift > - ;; > --rejoin) > arg_split_rejoin=1 > ;; > @@ -177,42 +174,37 @@ main () { > shift > > case "$opt" in > - -q) > + --quiet) > arg_quiet=1 > ;; > - -d) > + --debug) > arg_debug=1 > ;; > - --annotate) > + --annotate=*) > test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" > - arg_split_annotate="$1" > - shift > + arg_split_annotate="${opt#*=}" > ;; > --no-annotate) > test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" > arg_split_annotate= > ;; > - -b) > + --branch=*) > test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" > - arg_split_branch="$1" > - shift > + arg_split_branch="${opt#*=}" > ;; > - -P) > - arg_prefix="${1%/}" > - shift > + --prefix=*) > + arg_prefix="${opt#*=}" > ;; > - -m) > + --message=*) > test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command" > - arg_addmerge_message="$1" > - shift > + arg_addmerge_message="${opt#*=}" > ;; > --no-prefix) > arg_prefix= > ;; > - --onto) > + --onto=*) > test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" > - arg_split_onto="$1" > - shift > + arg_split_onto="${opt#*=}" > ;; > --no-onto) > test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" > -- > gitgitgadget > > -- D. Ben Knoble ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] contrib/subtree: parse using --stuck-long 2025-06-03 20:42 ` D. Ben Knoble @ 2025-06-04 13:56 ` Patrik Weiskircher 2025-06-04 14:09 ` Kristoffer Haugsbakk 0 siblings, 1 reply; 12+ messages in thread From: Patrik Weiskircher @ 2025-06-04 13:56 UTC (permalink / raw) To: D. Ben Knoble Cc: Patrik Weiskircher via GitGitGadget, git, apenwarr, Junio C Hamano On Tue, Jun 3, 2025 at 4:42 PM D. Ben Knoble <ben.knoble@gmail.com> wrote: > > On Mon, Jun 2, 2025 at 12:41 PM Patrik Weiskircher via GitGitGadget > <gitgitgadget@gmail.com> wrote: > > > > From: Patrik Weiskircher <patrik@pspdfkit.com> > > > > -S/--gpg-sign requires an optional parameter. Optional parameter > > handling only works unambiguous with git rev-parse --parseopt when using > > the --stuck-long option. > > Here we mention "-S", but that flag isn't implemented yet, right? > > Perhaps something like: > > Optional parameter handling only works unambiguous with git rev-parse > --parseopt when using the --stuck-long option. To prepare for future commits > which add flags with optional parameters, parse with --stuck-long. > Makes sense! Changing that. What is a good policy to resubmit something? Should I wait longer? Sorry, very new here! ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] contrib/subtree: parse using --stuck-long 2025-06-04 13:56 ` Patrik Weiskircher @ 2025-06-04 14:09 ` Kristoffer Haugsbakk 2025-06-04 15:41 ` Junio C Hamano 0 siblings, 1 reply; 12+ messages in thread From: Kristoffer Haugsbakk @ 2025-06-04 14:09 UTC (permalink / raw) To: Patrik Weiskircher, D. Ben Knoble Cc: Josh Soref, git, apenwarr, Junio C Hamano On Wed, Jun 4, 2025, at 15:56, Patrik Weiskircher wrote: >> >> Here we mention "-S", but that flag isn't implemented yet, right? >> >> Perhaps something like: >> >> Optional parameter handling only works unambiguous with git rev-parse >> --parseopt when using the --stuck-long option. To prepare for future commits >> which add flags with optional parameters, parse with --stuck-long. >> > > Makes sense! Changing that. What is a good policy to resubmit > something? Should I wait longer? Sorry, very new here! • Force-push your branch to gitgitgadget • Edit the PR description with something like “Changes since v1:” to summarize the changes • (`/preview` comment) • To send the next version: `/submit` comment again I think that’s it. :) I don’t think there’s a need to wait if you don’t want to. -- Kristoffer Haugsbakk ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] contrib/subtree: parse using --stuck-long 2025-06-04 14:09 ` Kristoffer Haugsbakk @ 2025-06-04 15:41 ` Junio C Hamano 2025-06-04 15:43 ` Patrik Weiskircher 0 siblings, 1 reply; 12+ messages in thread From: Junio C Hamano @ 2025-06-04 15:41 UTC (permalink / raw) To: Kristoffer Haugsbakk Cc: Patrik Weiskircher, D. Ben Knoble, Josh Soref, git, apenwarr "Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail.com> writes: > On Wed, Jun 4, 2025, at 15:56, Patrik Weiskircher wrote: >>> >>> Here we mention "-S", but that flag isn't implemented yet, right? >>> >>> Perhaps something like: >>> >>> Optional parameter handling only works unambiguous with git rev-parse >>> --parseopt when using the --stuck-long option. To prepare for future commits >>> which add flags with optional parameters, parse with --stuck-long. >>> >> >> Makes sense! Changing that. What is a good policy to resubmit >> something? Should I wait longer? Sorry, very new here! > > • Force-push your branch to gitgitgadget > • Edit the PR description with something like “Changes since v1:” to > summarize the changes > • (`/preview` comment) > • To send the next version: `/submit` comment again > > I think that’s it. :) > > I don’t think there’s a need to wait if you don’t want to. It would be nice for potential reviewers to give at least 24 hours to ensure people anywhere on the globe have a chance to comment, and a chance for you to respond to them, before sending your next iteration. Also, for future reference, when responding to a review comment that causes you to drastically change the course of the series, you can respond whenever you want to, but it is nice to other potential reviewers to give at least 24 hours to voice their opinions, before sending an updated series based on that comment, since suggested changes in such a comment may be controversial and after seeing you spend some time already to adjust to it, others may feel discouraged to make you redo your series again even whey they think the suggested changes are not taking us in the right direction. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/2] contrib/subtree: parse using --stuck-long 2025-06-04 15:41 ` Junio C Hamano @ 2025-06-04 15:43 ` Patrik Weiskircher 0 siblings, 0 replies; 12+ messages in thread From: Patrik Weiskircher @ 2025-06-04 15:43 UTC (permalink / raw) To: Junio C Hamano Cc: Kristoffer Haugsbakk, D. Ben Knoble, Josh Soref, git, apenwarr On Wed, Jun 4, 2025 at 11:41 AM Junio C Hamano <gitster@pobox.com> wrote: > > "Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail.com> writes: > > > On Wed, Jun 4, 2025, at 15:56, Patrik Weiskircher wrote: > >>> > >>> Here we mention "-S", but that flag isn't implemented yet, right? > >>> > >>> Perhaps something like: > >>> > >>> Optional parameter handling only works unambiguous with git rev-parse > >>> --parseopt when using the --stuck-long option. To prepare for future commits > >>> which add flags with optional parameters, parse with --stuck-long. > >>> > >> > >> Makes sense! Changing that. What is a good policy to resubmit > >> something? Should I wait longer? Sorry, very new here! > > > > • Force-push your branch to gitgitgadget > > • Edit the PR description with something like “Changes since v1:” to > > summarize the changes > > • (`/preview` comment) > > • To send the next version: `/submit` comment again > > > > I think that’s it. :) > > > > I don’t think there’s a need to wait if you don’t want to. > > It would be nice for potential reviewers to give at least 24 hours > to ensure people anywhere on the globe have a chance to comment, and > a chance for you to respond to them, before sending your next > iteration. > > Also, for future reference, when responding to a review comment that > causes you to drastically change the course of the series, you can > respond whenever you want to, but it is nice to other potential > reviewers to give at least 24 hours to voice their opinions, before > sending an updated series based on that comment, since suggested > changes in such a comment may be controversial and after seeing you > spend some time already to adjust to it, others may feel discouraged > to make you redo your series again even whey they think the > suggested changes are not taking us in the right direction. Makes sense! I'll keep that in mind for the future! ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/2] contrib/subtree: add -S/--gpg-sign 2025-06-02 16:40 [PATCH 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-02 16:40 ` [PATCH 1/2] contrib/subtree: parse using --stuck-long Patrik Weiskircher via GitGitGadget @ 2025-06-02 16:40 ` Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget 2 siblings, 0 replies; 12+ messages in thread From: Patrik Weiskircher via GitGitGadget @ 2025-06-02 16:40 UTC (permalink / raw) To: git; +Cc: apenwarr, Junio C Hamano, Patrik Weiskircher, Patrik Weiskircher From: Patrik Weiskircher <patrik@pspdfkit.com> Allows optionally signing the commits that git subtree creates. This can be necessary when working in a repository that requires gpg signed commits. Signed-off-by: Patrik Weiskircher <patrik@pspdfkit.com> --- contrib/subtree/git-subtree.adoc | 19 +++-- contrib/subtree/git-subtree.sh | 32 ++++---- contrib/subtree/t/t7900-subtree.sh | 113 +++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 19 deletions(-) diff --git a/contrib/subtree/git-subtree.adoc b/contrib/subtree/git-subtree.adoc index 004abf415b8e..b2bcbcad0d05 100644 --- a/contrib/subtree/git-subtree.adoc +++ b/contrib/subtree/git-subtree.adoc @@ -9,14 +9,14 @@ git-subtree - Merge subtrees together and split repository into subtrees SYNOPSIS -------- [verse] -'git subtree' [<options>] -P <prefix> add <local-commit> -'git subtree' [<options>] -P <prefix> add <repository> <remote-ref> -'git subtree' [<options>] -P <prefix> merge <local-commit> [<repository>] -'git subtree' [<options>] -P <prefix> split [<local-commit>] +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] add <local-commit> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] add <repository> <remote-ref> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] merge <local-commit> [<repository>] +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] split [<local-commit>] [verse] -'git subtree' [<options>] -P <prefix> pull <repository> <remote-ref> -'git subtree' [<options>] -P <prefix> push <repository> <refspec> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] pull <repository> <remote-ref> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] push <repository> <refspec> DESCRIPTION ----------- @@ -149,6 +149,13 @@ OPTIONS FOR ALL COMMANDS want to manipulate. This option is mandatory for all commands. +-S[<keyid>]:: +--gpg-sign[=<keyid>]:: +--no-gpg-sign:: + GPG-sign commits. The `keyid` argument is optional and + defaults to the committer identity; `--no-gpg-sign` is useful to + countermand a `--gpg-sign` option given earlier on the command line. + OPTIONS FOR 'add' AND 'merge' (ALSO: 'pull', 'split --rejoin', AND 'push --rejoin') ----------------------------------------------------------------------------------- These options for 'add' and 'merge' may also be given to 'pull' (which diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index 60b2431b8bba..3fddba797cb9 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -26,12 +26,12 @@ then fi OPTS_SPEC="\ -git subtree add --prefix=<prefix> <commit> -git subtree add --prefix=<prefix> <repository> <ref> -git subtree merge --prefix=<prefix> <commit> -git subtree split --prefix=<prefix> [<commit>] -git subtree pull --prefix=<prefix> <repository> <ref> -git subtree push --prefix=<prefix> <repository> <refspec> +git subtree add --prefix=<prefix> [-S[=<key-id>]] <commit> +git subtree add --prefix=<prefix> [-S[=<key-id>]] <repository> <ref> +git subtree merge --prefix=<prefix> [-S[=<key-id>]] <commit> +git subtree split --prefix=<prefix> [-S[=<key-id>]] [<commit>] +git subtree pull --prefix=<prefix> [-S[=<key-id>]] <repository> <ref> +git subtree push --prefix=<prefix> [-S[=<key-id>]] <repository> <refspec> -- h,help! show the help q,quiet! quiet @@ -46,6 +46,7 @@ rejoin merge the new branch back into HEAD options for 'add' and 'merge' (also: 'pull', 'split --rejoin', and 'push --rejoin') squash merge subtree changes as a single commit m,message!= use the given message as the commit message for the merge commit +S,gpg-sign?key-id GPG-sign commits. The keyid argument is optional and defaults to the committer identity " indent=0 @@ -168,6 +169,7 @@ main () { arg_split_annotate= arg_addmerge_squash= arg_addmerge_message= + arg_gpg_sign= while test $# -gt 0 do opt="$1" @@ -232,6 +234,9 @@ main () { test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command" arg_addmerge_squash= ;; + --gpg-sign=* | --gpg-sign | --no-gpg-sign) + arg_gpg_sign="$opt" + ;; --) break ;; @@ -264,6 +269,7 @@ main () { debug "quiet: {$arg_quiet}" debug "dir: {$dir}" debug "opts: {$*}" + debug "gpg-sign: {$arg_gpg_sign}" debug "cmd_$arg_command" "$@" @@ -529,7 +535,7 @@ copy_commit () { printf "%s" "$arg_split_annotate" cat ) | - git commit-tree "$2" $3 # reads the rest of stdin + git commit-tree $arg_gpg_sign "$2" $3 # reads the rest of stdin ) || die "fatal: can't copy commit $1" } @@ -675,10 +681,10 @@ new_squash_commit () { if test -n "$old" then squash_msg "$dir" "$oldsub" "$newsub" | - git commit-tree "$tree" -p "$old" || exit $? + git commit-tree $arg_gpg_sign "$tree" -p "$old" || exit $? else squash_msg "$dir" "" "$newsub" | - git commit-tree "$tree" || exit $? + git commit-tree $arg_gpg_sign "$tree" || exit $? fi } @@ -917,11 +923,11 @@ cmd_add_commit () { then rev=$(new_squash_commit "" "" "$rev") || exit $? commit=$(add_squashed_msg "$rev" "$dir" | - git commit-tree "$tree" $headp -p "$rev") || exit $? + git commit-tree $arg_gpg_sign "$tree" $headp -p "$rev") || exit $? else revp=$(peel_committish "$rev") || exit $? commit=$(add_msg "$dir" $headrev "$rev" | - git commit-tree "$tree" $headp -p "$revp") || exit $? + git commit-tree $arg_gpg_sign "$tree" $headp -p "$revp") || exit $? fi git reset "$commit" || exit $? @@ -1072,9 +1078,9 @@ cmd_merge () { if test -n "$arg_addmerge_message" then git merge --no-ff -Xsubtree="$arg_prefix" \ - --message="$arg_addmerge_message" "$rev" + --message="$arg_addmerge_message" $arg_gpg_sign "$rev" else - git merge --no-ff -Xsubtree="$arg_prefix" $rev + git merge --no-ff -Xsubtree="$arg_prefix" $arg_gpg_sign $rev fi } diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh index 3c6103f6d270..3edbb33af469 100755 --- a/contrib/subtree/t/t7900-subtree.sh +++ b/contrib/subtree/t/t7900-subtree.sh @@ -11,6 +11,7 @@ and push subcommands of git subtree. TEST_DIRECTORY=$(pwd)/../../../t . "$TEST_DIRECTORY"/test-lib.sh +. "$TEST_DIRECTORY"/lib-gpg.sh # Use our own wrapper around test-lib.sh's test_create_repo, in order # to set log.date=relative. `git subtree` parses the output of `git @@ -1563,4 +1564,116 @@ test_expect_success 'subtree descendant check' ' ) ' +test_expect_success GPG 'add subproj with GPG signing using -S flag' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" -S FETCH_HEAD && + git verify-commit HEAD && + test "$(last_commit_subject)" = "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''" + ) +' + +test_expect_success GPG 'add subproj with GPG signing using --gpg-sign flag' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" --gpg-sign FETCH_HEAD && + git verify-commit HEAD && + test "$(last_commit_subject)" = "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''" + ) +' + +test_expect_success GPG 'add subproj with GPG signing using specific key ID' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" -S"$GIT_COMMITTER_EMAIL" FETCH_HEAD && + git verify-commit HEAD && + test "$(last_commit_subject)" = "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''" + ) +' + +test_expect_success GPG 'merge with GPG signing' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" FETCH_HEAD + ) && + test_create_commit "$test_count/sub proj" sub2 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree merge --prefix="sub dir" -S FETCH_HEAD && + git verify-commit HEAD + ) +' + +test_expect_success GPG 'split with GPG signing and --rejoin' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" FETCH_HEAD + ) && + test_create_commit "$test_count" "sub dir/main-sub1" && + ( + cd "$test_count" && + git subtree split --prefix="sub dir" --rejoin -S && + git verify-commit HEAD + ) +' + +test_expect_success GPG 'add with --squash and GPG signing' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" --squash -S FETCH_HEAD && + git verify-commit HEAD && + # With --squash, the commit subject should reference the squash commit (first parent of merge) + squash_commit=$(git rev-parse HEAD^2) && + test "$(last_commit_subject)" = "Merge commit '\''$squash_commit'\'' as '\''sub dir'\''" + ) +' + +test_expect_success GPG 'pull with GPG signing' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git subtree add --prefix="sub dir" ./"sub proj" HEAD + ) && + test_create_commit "$test_count/sub proj" sub2 && + ( + cd "$test_count" && + git subtree pull --prefix="sub dir" -S ./"sub proj" HEAD && + git verify-commit HEAD + ) +' + test_done -- gitgitgadget ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign 2025-06-02 16:40 [PATCH 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-02 16:40 ` [PATCH 1/2] contrib/subtree: parse using --stuck-long Patrik Weiskircher via GitGitGadget 2025-06-02 16:40 ` [PATCH 2/2] contrib/subtree: add -S/--gpg-sign Patrik Weiskircher via GitGitGadget @ 2025-06-04 14:16 ` Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 1/2] contrib/subtree: parse using --stuck-long Patrik Weiskircher via GitGitGadget ` (2 more replies) 2 siblings, 3 replies; 12+ messages in thread From: Patrik Weiskircher via GitGitGadget @ 2025-06-04 14:16 UTC (permalink / raw) To: git Cc: apenwarr, Junio C Hamano, D. Ben Knoble, Patrik Weiskircher, Kristoffer Haugsbakk, Patrik Weiskircher This patch adds support for the -S/--gpg-sign option to the git subtree command. Currently, git subtree creates squash and merge commits without applying GPG signatures, even when commit signing is configured via commit.gpgSign. This causes issues in repositories that require signed commits for policy reasons. The implementation ensures that -S/--gpg-sign behaves consistently with other Git commands, passing the flag through to git commit-tree and git merge where appropriate. This change improves compatibility with workflows and repositories that enforce signed commits. Changes have been made to this patch according to a discussion with Junio C Hamano gitster@pobox.com on my previous patch attempt. Changes since v1: * Adjusted commit message to not mention the not implemented flag yet. Patrik Weiskircher (2): contrib/subtree: parse using --stuck-long contrib/subtree: add -S/--gpg-sign contrib/subtree/git-subtree.adoc | 19 +++-- contrib/subtree/git-subtree.sh | 66 ++++++++--------- contrib/subtree/t/t7900-subtree.sh | 113 +++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 40 deletions(-) base-commit: 0bd2d791cc9f745ebaedafc0e1cbebdebe41343e Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1928%2Fpweiskircher%2Fsubtree-sign-the-second-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1928/pweiskircher/subtree-sign-the-second-v2 Pull-Request: https://github.com/gitgitgadget/git/pull/1928 Range-diff vs v1: 1: fe7e918ba18 ! 1: 5bbdbf01636 contrib/subtree: parse using --stuck-long @@ Metadata ## Commit message ## contrib/subtree: parse using --stuck-long - -S/--gpg-sign requires an optional parameter. Optional parameter - handling only works unambiguous with git rev-parse --parseopt when using - the --stuck-long option. + Optional parameter handling only works unambiguous with git rev-parse + --parseopt when using the --stuck-long option. To prepare for future commits + which add flags with optional parameters, parse with --stuck-long. Signed-off-by: Patrik Weiskircher <patrik@pspdfkit.com> 2: 45ae2c31bc0 = 2: af5b4a65b63 contrib/subtree: add -S/--gpg-sign -- gitgitgadget ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 1/2] contrib/subtree: parse using --stuck-long 2025-06-04 14:16 ` [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget @ 2025-06-04 14:16 ` Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 2/2] contrib/subtree: add -S/--gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-04 16:33 ` [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign Junio C Hamano 2 siblings, 0 replies; 12+ messages in thread From: Patrik Weiskircher via GitGitGadget @ 2025-06-04 14:16 UTC (permalink / raw) To: git Cc: apenwarr, Junio C Hamano, D. Ben Knoble, Patrik Weiskircher, Kristoffer Haugsbakk, Patrik Weiskircher, Patrik Weiskircher From: Patrik Weiskircher <patrik@pspdfkit.com> Optional parameter handling only works unambiguous with git rev-parse --parseopt when using the --stuck-long option. To prepare for future commits which add flags with optional parameters, parse with --stuck-long. Signed-off-by: Patrik Weiskircher <patrik@pspdfkit.com> --- contrib/subtree/git-subtree.sh | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index 15ae86db1b27..60b2431b8bba 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -115,7 +115,7 @@ main () { then set -- -h fi - set_args="$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)" + set_args="$(echo "$OPTS_SPEC" | git rev-parse --parseopt --stuck-long -- "$@" || echo exit $?)" eval "$set_args" . git-sh-setup require_work_tree @@ -131,9 +131,6 @@ main () { opt="$1" shift case "$opt" in - --annotate|-b|-P|-m|--onto) - shift - ;; --rejoin) arg_split_rejoin=1 ;; @@ -177,42 +174,37 @@ main () { shift case "$opt" in - -q) + --quiet) arg_quiet=1 ;; - -d) + --debug) arg_debug=1 ;; - --annotate) + --annotate=*) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" - arg_split_annotate="$1" - shift + arg_split_annotate="${opt#*=}" ;; --no-annotate) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" arg_split_annotate= ;; - -b) + --branch=*) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" - arg_split_branch="$1" - shift + arg_split_branch="${opt#*=}" ;; - -P) - arg_prefix="${1%/}" - shift + --prefix=*) + arg_prefix="${opt#*=}" ;; - -m) + --message=*) test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command" - arg_addmerge_message="$1" - shift + arg_addmerge_message="${opt#*=}" ;; --no-prefix) arg_prefix= ;; - --onto) + --onto=*) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" - arg_split_onto="$1" - shift + arg_split_onto="${opt#*=}" ;; --no-onto) test -n "$allow_split" || die_incompatible_opt "$opt" "$arg_command" -- gitgitgadget ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 2/2] contrib/subtree: add -S/--gpg-sign 2025-06-04 14:16 ` [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 1/2] contrib/subtree: parse using --stuck-long Patrik Weiskircher via GitGitGadget @ 2025-06-04 14:16 ` Patrik Weiskircher via GitGitGadget 2025-06-04 16:33 ` [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign Junio C Hamano 2 siblings, 0 replies; 12+ messages in thread From: Patrik Weiskircher via GitGitGadget @ 2025-06-04 14:16 UTC (permalink / raw) To: git Cc: apenwarr, Junio C Hamano, D. Ben Knoble, Patrik Weiskircher, Kristoffer Haugsbakk, Patrik Weiskircher, Patrik Weiskircher From: Patrik Weiskircher <patrik@pspdfkit.com> Allows optionally signing the commits that git subtree creates. This can be necessary when working in a repository that requires gpg signed commits. Signed-off-by: Patrik Weiskircher <patrik@pspdfkit.com> --- contrib/subtree/git-subtree.adoc | 19 +++-- contrib/subtree/git-subtree.sh | 32 ++++---- contrib/subtree/t/t7900-subtree.sh | 113 +++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 19 deletions(-) diff --git a/contrib/subtree/git-subtree.adoc b/contrib/subtree/git-subtree.adoc index 004abf415b8e..b2bcbcad0d05 100644 --- a/contrib/subtree/git-subtree.adoc +++ b/contrib/subtree/git-subtree.adoc @@ -9,14 +9,14 @@ git-subtree - Merge subtrees together and split repository into subtrees SYNOPSIS -------- [verse] -'git subtree' [<options>] -P <prefix> add <local-commit> -'git subtree' [<options>] -P <prefix> add <repository> <remote-ref> -'git subtree' [<options>] -P <prefix> merge <local-commit> [<repository>] -'git subtree' [<options>] -P <prefix> split [<local-commit>] +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] add <local-commit> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] add <repository> <remote-ref> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] merge <local-commit> [<repository>] +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] split [<local-commit>] [verse] -'git subtree' [<options>] -P <prefix> pull <repository> <remote-ref> -'git subtree' [<options>] -P <prefix> push <repository> <refspec> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] pull <repository> <remote-ref> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] push <repository> <refspec> DESCRIPTION ----------- @@ -149,6 +149,13 @@ OPTIONS FOR ALL COMMANDS want to manipulate. This option is mandatory for all commands. +-S[<keyid>]:: +--gpg-sign[=<keyid>]:: +--no-gpg-sign:: + GPG-sign commits. The `keyid` argument is optional and + defaults to the committer identity; `--no-gpg-sign` is useful to + countermand a `--gpg-sign` option given earlier on the command line. + OPTIONS FOR 'add' AND 'merge' (ALSO: 'pull', 'split --rejoin', AND 'push --rejoin') ----------------------------------------------------------------------------------- These options for 'add' and 'merge' may also be given to 'pull' (which diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index 60b2431b8bba..3fddba797cb9 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -26,12 +26,12 @@ then fi OPTS_SPEC="\ -git subtree add --prefix=<prefix> <commit> -git subtree add --prefix=<prefix> <repository> <ref> -git subtree merge --prefix=<prefix> <commit> -git subtree split --prefix=<prefix> [<commit>] -git subtree pull --prefix=<prefix> <repository> <ref> -git subtree push --prefix=<prefix> <repository> <refspec> +git subtree add --prefix=<prefix> [-S[=<key-id>]] <commit> +git subtree add --prefix=<prefix> [-S[=<key-id>]] <repository> <ref> +git subtree merge --prefix=<prefix> [-S[=<key-id>]] <commit> +git subtree split --prefix=<prefix> [-S[=<key-id>]] [<commit>] +git subtree pull --prefix=<prefix> [-S[=<key-id>]] <repository> <ref> +git subtree push --prefix=<prefix> [-S[=<key-id>]] <repository> <refspec> -- h,help! show the help q,quiet! quiet @@ -46,6 +46,7 @@ rejoin merge the new branch back into HEAD options for 'add' and 'merge' (also: 'pull', 'split --rejoin', and 'push --rejoin') squash merge subtree changes as a single commit m,message!= use the given message as the commit message for the merge commit +S,gpg-sign?key-id GPG-sign commits. The keyid argument is optional and defaults to the committer identity " indent=0 @@ -168,6 +169,7 @@ main () { arg_split_annotate= arg_addmerge_squash= arg_addmerge_message= + arg_gpg_sign= while test $# -gt 0 do opt="$1" @@ -232,6 +234,9 @@ main () { test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command" arg_addmerge_squash= ;; + --gpg-sign=* | --gpg-sign | --no-gpg-sign) + arg_gpg_sign="$opt" + ;; --) break ;; @@ -264,6 +269,7 @@ main () { debug "quiet: {$arg_quiet}" debug "dir: {$dir}" debug "opts: {$*}" + debug "gpg-sign: {$arg_gpg_sign}" debug "cmd_$arg_command" "$@" @@ -529,7 +535,7 @@ copy_commit () { printf "%s" "$arg_split_annotate" cat ) | - git commit-tree "$2" $3 # reads the rest of stdin + git commit-tree $arg_gpg_sign "$2" $3 # reads the rest of stdin ) || die "fatal: can't copy commit $1" } @@ -675,10 +681,10 @@ new_squash_commit () { if test -n "$old" then squash_msg "$dir" "$oldsub" "$newsub" | - git commit-tree "$tree" -p "$old" || exit $? + git commit-tree $arg_gpg_sign "$tree" -p "$old" || exit $? else squash_msg "$dir" "" "$newsub" | - git commit-tree "$tree" || exit $? + git commit-tree $arg_gpg_sign "$tree" || exit $? fi } @@ -917,11 +923,11 @@ cmd_add_commit () { then rev=$(new_squash_commit "" "" "$rev") || exit $? commit=$(add_squashed_msg "$rev" "$dir" | - git commit-tree "$tree" $headp -p "$rev") || exit $? + git commit-tree $arg_gpg_sign "$tree" $headp -p "$rev") || exit $? else revp=$(peel_committish "$rev") || exit $? commit=$(add_msg "$dir" $headrev "$rev" | - git commit-tree "$tree" $headp -p "$revp") || exit $? + git commit-tree $arg_gpg_sign "$tree" $headp -p "$revp") || exit $? fi git reset "$commit" || exit $? @@ -1072,9 +1078,9 @@ cmd_merge () { if test -n "$arg_addmerge_message" then git merge --no-ff -Xsubtree="$arg_prefix" \ - --message="$arg_addmerge_message" "$rev" + --message="$arg_addmerge_message" $arg_gpg_sign "$rev" else - git merge --no-ff -Xsubtree="$arg_prefix" $rev + git merge --no-ff -Xsubtree="$arg_prefix" $arg_gpg_sign $rev fi } diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh index 3c6103f6d270..3edbb33af469 100755 --- a/contrib/subtree/t/t7900-subtree.sh +++ b/contrib/subtree/t/t7900-subtree.sh @@ -11,6 +11,7 @@ and push subcommands of git subtree. TEST_DIRECTORY=$(pwd)/../../../t . "$TEST_DIRECTORY"/test-lib.sh +. "$TEST_DIRECTORY"/lib-gpg.sh # Use our own wrapper around test-lib.sh's test_create_repo, in order # to set log.date=relative. `git subtree` parses the output of `git @@ -1563,4 +1564,116 @@ test_expect_success 'subtree descendant check' ' ) ' +test_expect_success GPG 'add subproj with GPG signing using -S flag' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" -S FETCH_HEAD && + git verify-commit HEAD && + test "$(last_commit_subject)" = "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''" + ) +' + +test_expect_success GPG 'add subproj with GPG signing using --gpg-sign flag' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" --gpg-sign FETCH_HEAD && + git verify-commit HEAD && + test "$(last_commit_subject)" = "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''" + ) +' + +test_expect_success GPG 'add subproj with GPG signing using specific key ID' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" -S"$GIT_COMMITTER_EMAIL" FETCH_HEAD && + git verify-commit HEAD && + test "$(last_commit_subject)" = "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''" + ) +' + +test_expect_success GPG 'merge with GPG signing' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" FETCH_HEAD + ) && + test_create_commit "$test_count/sub proj" sub2 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree merge --prefix="sub dir" -S FETCH_HEAD && + git verify-commit HEAD + ) +' + +test_expect_success GPG 'split with GPG signing and --rejoin' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" FETCH_HEAD + ) && + test_create_commit "$test_count" "sub dir/main-sub1" && + ( + cd "$test_count" && + git subtree split --prefix="sub dir" --rejoin -S && + git verify-commit HEAD + ) +' + +test_expect_success GPG 'add with --squash and GPG signing' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git fetch ./"sub proj" HEAD && + git subtree add --prefix="sub dir" --squash -S FETCH_HEAD && + git verify-commit HEAD && + # With --squash, the commit subject should reference the squash commit (first parent of merge) + squash_commit=$(git rev-parse HEAD^2) && + test "$(last_commit_subject)" = "Merge commit '\''$squash_commit'\'' as '\''sub dir'\''" + ) +' + +test_expect_success GPG 'pull with GPG signing' ' + subtree_test_create_repo "$test_count" && + subtree_test_create_repo "$test_count/sub proj" && + test_create_commit "$test_count" main1 && + test_create_commit "$test_count/sub proj" sub1 && + ( + cd "$test_count" && + git subtree add --prefix="sub dir" ./"sub proj" HEAD + ) && + test_create_commit "$test_count/sub proj" sub2 && + ( + cd "$test_count" && + git subtree pull --prefix="sub dir" -S ./"sub proj" HEAD && + git verify-commit HEAD + ) +' + test_done -- gitgitgadget ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign 2025-06-04 14:16 ` [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 1/2] contrib/subtree: parse using --stuck-long Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 2/2] contrib/subtree: add -S/--gpg-sign Patrik Weiskircher via GitGitGadget @ 2025-06-04 16:33 ` Junio C Hamano 2 siblings, 0 replies; 12+ messages in thread From: Junio C Hamano @ 2025-06-04 16:33 UTC (permalink / raw) To: Patrik Weiskircher via GitGitGadget Cc: git, apenwarr, D. Ben Knoble, Patrik Weiskircher, Kristoffer Haugsbakk, Patrik Weiskircher "Patrik Weiskircher via GitGitGadget" <gitgitgadget@gmail.com> writes: > Changes since v1: > > * Adjusted commit message to not mention the not implemented flag yet. > > Patrik Weiskircher (2): > contrib/subtree: parse using --stuck-long > contrib/subtree: add -S/--gpg-sign > > contrib/subtree/git-subtree.adoc | 19 +++-- > contrib/subtree/git-subtree.sh | 66 ++++++++--------- > contrib/subtree/t/t7900-subtree.sh | 113 +++++++++++++++++++++++++++++ > 3 files changed, 158 insertions(+), 40 deletions(-) Still looking good. Will queue. Thanks. ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2025-06-04 16:33 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-02 16:40 [PATCH 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-02 16:40 ` [PATCH 1/2] contrib/subtree: parse using --stuck-long Patrik Weiskircher via GitGitGadget 2025-06-03 20:42 ` D. Ben Knoble 2025-06-04 13:56 ` Patrik Weiskircher 2025-06-04 14:09 ` Kristoffer Haugsbakk 2025-06-04 15:41 ` Junio C Hamano 2025-06-04 15:43 ` Patrik Weiskircher 2025-06-02 16:40 ` [PATCH 2/2] contrib/subtree: add -S/--gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 1/2] contrib/subtree: parse using --stuck-long Patrik Weiskircher via GitGitGadget 2025-06-04 14:16 ` [PATCH v2 2/2] contrib/subtree: add -S/--gpg-sign Patrik Weiskircher via GitGitGadget 2025-06-04 16:33 ` [PATCH v2 0/2] contrib/subtree: Add -S/-gpg-sign Junio C Hamano
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).