- Detect delta cycles in
Pack.resolve_object: a crafted pack with REF_DELTA objects that name each other sentget_rawinto an unbounded loop. Such chains now raiseDeltaCycle. - Fix
porcelain.cleanwhen the target directory and the repository path are spelled differently, such as via a relative path or a symlink. (Jelmer Vernooij) - Memoize tag peeling on the object store, so refs sharing an annotated tag chain no longer re-walk it once per ref.
show_ref --dereferenceand the ref advertisement were quadratic. (Jelmer Vernooij, #2406) - Give a
.gitignorein a subdirectory precedence over one closer to the root, matching git. A negation in a deeper file no longer loses to a rule at the root, and a nested negation no longer re-includes a path whose parent directory stays excluded. (Jelmer Vernooij, #2399) - Reject reftable
tables.listentries that contain a path separator or are absolute, so a hostile repository cannot make a ref lookup open a file outside the reftable directory. (netliomax25-code) - Support
dulwich commit -C/--reuse-messageand-c/--reedit-messageto reuse a commit's message, author and author date, optionally editing the message. The committer and new commit ancestry remain independent. (eunwoo song, #1845) - List local branches for bare
dulwich branchand standalonedulwich branch --list [pattern]. Listing empty repositories or patterns with no matches succeeds without changing refs. (be-student, #1847) - Add
dulwich commit --author="Name <email>"to override the author of a new or amended commit. (kudala-bharani, #1845) - Set
branch.<name>.remoteandbranch.<name>.mergefor the branch checked out by a clone, so that a subsequentgit pullwith no arguments has tracking information. (Jelmer Vernooij, #2376) - Keep relative paths relative in
SSHGitClient.get_url, emitting git'sssh://host/~/pathform. Cloning from an scp-style URL likeuser@host:git/repo.gitpreviously storedssh://user@host/git/repo.gitas the remote URL, which points at a different repository. (Jelmer Vernooij, #2375) - Name a symlink by its own path in
porcelain.path_to_tree_path, rather than by the path of its target.porcelain.statuslisted a tracked symlink as untracked whenever the file it pointed at was itself untracked or missing, so a modified symlink was reported twice. (Jerry Xiao) - Ignore gitignore lines that carry no pattern, such as a bare
!or/. A bare!previously re-included a directory that an earlier pattern in the same file had ignored. (Jelmer Vernooij, #2398) - Avoid quadratic cost in
PktLineParser.parse, which resliced its remaining buffer once per pkt-line. (Jelmer Vernooij, #2408)