@@ -134,6 +134,9 @@ static int git_worktree_config(const char *var, const char *value,
134134 if (!strcmp (var , "worktree.guessremote" )) {
135135 guess_remote = git_config_bool (var , value );
136136 return 0 ;
137+ } else if (!strcmp (var , "worktree.userelativepaths" )) {
138+ use_relative_paths = git_config_bool (var , value );
139+ return 0 ;
137140 }
138141
139142 return git_default_config (var , value , ctx , cb );
@@ -414,8 +417,7 @@ static int add_worktree(const char *path, const char *refname,
414417 const struct add_opts * opts )
415418{
416419 struct strbuf sb_git = STRBUF_INIT , sb_repo = STRBUF_INIT ;
417- struct strbuf sb = STRBUF_INIT , sb_tmp = STRBUF_INIT ;
418- struct strbuf sb_path_realpath = STRBUF_INIT , sb_repo_realpath = STRBUF_INIT ;
420+ struct strbuf sb = STRBUF_INIT ;
419421 const char * name ;
420422 struct strvec child_env = STRVEC_INIT ;
421423 unsigned int counter = 0 ;
@@ -491,10 +493,7 @@ static int add_worktree(const char *path, const char *refname,
491493
492494 strbuf_reset (& sb );
493495 strbuf_addf (& sb , "%s/gitdir" , sb_repo .buf );
494- strbuf_realpath (& sb_path_realpath , path , 1 );
495- strbuf_realpath (& sb_repo_realpath , sb_repo .buf , 1 );
496- write_file (sb .buf , "%s/.git" , relative_path (sb_path_realpath .buf , sb_repo_realpath .buf , & sb_tmp ));
497- write_file (sb_git .buf , "gitdir: %s" , relative_path (sb_repo_realpath .buf , sb_path_realpath .buf , & sb_tmp ));
496+ write_worktree_linking_files (sb_git , sb );
498497 strbuf_reset (& sb );
499498 strbuf_addf (& sb , "%s/commondir" , sb_repo .buf );
500499 write_file (sb .buf , "../.." );
@@ -578,12 +577,9 @@ static int add_worktree(const char *path, const char *refname,
578577
579578 strvec_clear (& child_env );
580579 strbuf_release (& sb );
581- strbuf_release (& sb_tmp );
582580 strbuf_release (& symref );
583581 strbuf_release (& sb_repo );
584- strbuf_release (& sb_repo_realpath );
585582 strbuf_release (& sb_git );
586- strbuf_release (& sb_path_realpath );
587583 strbuf_release (& sb_name );
588584 free_worktree (wt );
589585 return ret ;
@@ -796,6 +792,8 @@ static int add(int ac, const char **av, const char *prefix)
796792 PARSE_OPT_NOARG | PARSE_OPT_OPTARG ),
797793 OPT_BOOL (0 , "guess-remote" , & guess_remote ,
798794 N_ ("try to match the new branch name with a remote-tracking branch" )),
795+ OPT_BOOL (0 , "relative-paths" , & use_relative_paths ,
796+ N_ ("use relative paths for worktrees" )),
799797 OPT_END ()
800798 };
801799 int ret ;
@@ -1189,6 +1187,8 @@ static int move_worktree(int ac, const char **av, const char *prefix)
11891187 OPT__FORCE (& force ,
11901188 N_ ("force move even if worktree is dirty or locked" ),
11911189 PARSE_OPT_NOCOMPLETE ),
1190+ OPT_BOOL (0 , "relative-paths" , & use_relative_paths ,
1191+ N_ ("use relative paths for worktrees" )),
11921192 OPT_END ()
11931193 };
11941194 struct worktree * * worktrees , * wt ;
@@ -1382,6 +1382,8 @@ static int repair(int ac, const char **av, const char *prefix)
13821382 const char * * p ;
13831383 const char * self [] = { "." , NULL };
13841384 struct option options [] = {
1385+ OPT_BOOL (0 , "relative-paths" , & use_relative_paths ,
1386+ N_ ("use relative paths for worktrees" )),
13851387 OPT_END ()
13861388 };
13871389 int rc = 0 ;
0 commit comments