From: martin f. krafft Date: Sat, 27 Apr 2013 06:17:30 +0000 (+0200) Subject: Keep worktree relative to GIT_DIR X-Git-Url: https://git.madduck.net/code/vcsh.git/commitdiff_plain/e9a6b438443bad91e92032fbb9923aa3ebd5bb5b?ds=sidebyside;hp=--cc Keep worktree relative to GIT_DIR core.worktree can be set relatively to GIT_DIR, thereby preventing the hard-coding of the home directory path, which should make a vcsh setup more portable. On the other hand, this means that the vcsh repo.d is now invariably linked to its position, relative to the base directory. Apply this patch only if you think it to be less likely that people change ~/.config/vcsh/repo.d to something else, than they would rsync/tar/mv a whole tree to a different $HOME. Paths are resolved using Git itself, for maximum portability. In addition to making sure the new method works on new repositories, I checked that - "old" repositories can be used with the new code just fine; - upgrading works. Signed-off-by: martin f. krafft --- e9a6b438443bad91e92032fbb9923aa3ebd5bb5b diff --git a/vcsh b/vcsh index 3fa63d7..d45e95d 100755 --- a/vcsh +++ b/vcsh @@ -197,9 +197,8 @@ hook() { init() { [ ! -e "$GIT_DIR" ] || fatal "'$GIT_DIR' exists" 10 - export GIT_WORK_TREE="$VCSH_BASE" - mkdir -p "$GIT_WORK_TREE" || fatal "could not create '$GIT_WORK_TREE'" 50 - cd "$GIT_WORK_TREE" || fatal "could not enter '$GIT_WORK_TREE'" 11 + mkdir -p "$VCSH_BASE" || fatal "could not create '$VCSH_BASE'" 50 + cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11 git init upgrade } @@ -275,17 +274,22 @@ run() { upgrade() { hook pre-upgrade - use - git config core.worktree "$GIT_WORK_TREE" + # fake-bare repositories are not bare, actually. Set this to false + # because otherwise Git complains "fatal: core.bare and core.worktree + # do not make sense" + git config core.bare false + # in core.worktree, keep a relative reference to the base directory + git config core.worktree $(cd $GIT_DIR && GIT_WORK_TREE="$VCSH_BASE" git rev-parse --show-cdup) [ ! "x$VCSH_GITIGNORE" = 'xnone' ] && git config core.excludesfile ".gitignore.d/$VCSH_REPO_NAME" git config vcsh.vcsh 'true' + use [ -e "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" ] && git add -f "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" hook post-upgrade } use() { git_dir_exists - export GIT_WORK_TREE="$(git config --get core.worktree)" + export GIT_WORK_TREE="$(git rev-parse --show-toplevel)" export VCSH_DIRECTORY="$VCSH_REPO_NAME" }