git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Bug Report: Subtrees and GPG Signed Commits

From
Stephen R Guglielmo <srguglielmo@gmail.com>
Date
Jan 6, 2018, 22:45 UTC
Message-ID
<CADfK3RWXDuE=hYD==4sHXO1iJeOiVDOp7hBqhBtSn7gnQ+x7Qg@mail.gmail.com>
Hi all,

I've noticed an issue regarding the use of `git subtree add` and `git subtree pull` when the subtree repository's commit (either HEAD or whatever commit specified by the subtree command) is signed with GPG. It seems to work properly if the commit is not signed but previous commits are.

The gist of the issue is that `git subtree add` does not add the subree properly and a "fatal: Not a valid object name" error is thrown. Running `git subtree pull` does not pull any upstream changes after that ("'subtree' was never added").

I have not done extensive testing, however, below are instructions to reproduce the issue. This was tested using git version 2.15.1 installed via Homebrew on MacOS. I did not test with the built-in version of git on MacOS.

Thanks, Steve

# Create a new repository mkdir repoA && cd repoA git init echo "Test File in Repo A" > FileA git add -A && git commit -m 'Initial commit in repo A'

# Create a second repository cd .. && mkdir repoB && cd repoB git init echo "Test File in Repo B" > FileB git add -A && git commit -m 'Initial commit in repo B'

# Create a signed commit in repo B echo "Signed Commit" >> FileB git commit -a -S -m 'Signed commit in repo B'

# Now, add repoB as a subtree of RepoA
cd ../repoA
git subtree add --prefix repoB_subtree/ ../repoB/ master --squash
# Output:
git fetch ../repoB/ master
warning: no common commits
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From ../repoB
 * branch            master     -> FETCH_HEAD
fatal: Not a valid object name gpg: Signature made Sat Jan  6 17:38:31 2018 EST
gpg:                using RSA key 6900E9CFDD39B6A741D601F50999759F2DCF3E7C
gpg: Good signature from "Stephen Robert Guglielmo (Temple University
Computer Services) <srg@temple.edu>" [ultimate]
Primary key fingerprint: 6900 E9CF DD39 B6A7 41D6  01F5 0999 759F 2DCF 3E7C
4b700b1a4ebb9e2c1011aafd6b0f720b38f059a4
# Note, git exits with status 128 at this point.

# FileB was in fact added and staged to repoA, despite the "fatal" above. Commit it: git commit -m 'Add repoB subtree'

# Ok, let's make another commit in repoB and try a `subtree pull`
instead of `subtree add`
cd ../repoB
echo "Another Line" >> FileB
git commit -a -S -m 'Another signed commit'
cd ../repoA
git subtree pull --prefix repoB_subtree/ ../repoB master --squash
# Output:
warning: no common commits
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 9 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From ../repoB
 * branch            master     -> FETCH_HEAD
Can't squash-merge: 'repoB_subtree' was never added.
# Note, git exits with status 1 at this point.

# RepoB's third commit ('Another signed commit') is not pulled into the subree in repo A. # This can be verified by running a diff: diff -qr --exclude ".git" repoB_subtree ../repoB # Output: Files repoB_subtree/FileB and ../repoB/FileB differ

Next: Stephen R Guglielmo
Message 1 of 12 in “Bug Report: Subtrees and GPG Signed Commits”
  1. Stephen R GuglielmoJan 6, 2018
  2. Stephen R GuglielmoJan 18, 2018
  3. Stephen R GuglielmoJan 30, 2018
  4. Stefan BellerJan 30, 2018
  5. Junio C HamanoJan 30, 2018
  6. Avery PennarunJan 30, 2018
  7. Stephen R GuglielmoJan 31, 2018
  8. Junio C HamanoFeb 2, 2018
  9. Stephen R GuglielmoFeb 5, 2018
  10. Stephen R GuglielmoFeb 5, 2018
  11. Junio C HamanoFeb 5, 2018
  12. Stephen R GuglielmoFeb 8, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.