diff options
| author | Mark Levedahl <mlevedahl@gmail.com> | 2025-07-21 11:12:18 -0400 |
|---|---|---|
| committer | Mark Levedahl <mlevedahl@gmail.com> | 2025-07-21 18:22:33 -0400 |
| commit | 3ce650f4c93f9f3aacdb6a1d8cef21bb2009bfa3 (patch) | |
| tree | 493078163da4811bf854188dafa12e7e9d3931dc | |
| parent | 6ff8d68ec1adf170aa57630989fde092d18e02de (diff) | |
| download | git-3ce650f4c93f9f3aacdb6a1d8cef21bb2009bfa3.tar.gz | |
git-gui: default to full copy for linked worktrees
git-gui's default clone method is git-clone's default, and this uses
hardlinks rather than copying the objects directory for local
repositories. However, this method explicitly fails if a symlink (or
.gitfile) exists in the path to the objects directory. Thus, the default
clone option fails for worktrees created by git-new-workdir or
git-worktree. git-gui's original do_clone trapped this error for a
symlinked git-new-workdir tree, directly falling back to a full clone,
while the updated git-gui using git-clone does not. (The old do_clone
could not handle gitfile linked worktrees, however).
Let's apply the more friendly fallback to a full clone in both these
cases where git-clone behavior throws an error on the default method.
Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>
| -rw-r--r-- | lib/choose_repository.tcl | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index e74c39c34c..2bd230b5d2 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -557,6 +557,25 @@ method _update_clone {args} { method _do_clone2 {} { if {[file isdirectory $origin_url]} { set origin_url [file normalize $origin_url] + if {$clone_type eq {hardlink}} { + # cannot use hardlinks if this is a linked worktree (.gitfile or git-new-workdir) + if {[git -C $origin_url rev-parse --is-inside-work-tree] == {true}} { + set islink 0 + set dotgit [file join $origin_url .git] + if {[file isfile $dotgit]} { + set islink 1 + } else { + set objdir [file join $dotgit objects] + if {[file exists $objdir] && [file type $objdir] == {link}} { + set islink 1 + } + } + if {$islink} { + info_popup [mc "Hardlinks are unavailable. Falling back to copying."] + set clone_type full + } + } + } } if {$clone_type eq {hardlink} && ![file isdirectory $origin_url]} { |
