#!/bin/sh test_description='pulling from symlinked subdir' . ./test-lib.sh # The scenario we are building: # # trash\ directory/ # clone-repo/ # subdir/ # bar # subdir-link -> clone-repo/subdir/ # # The working directory is subdir-link. test_expect_success SYMLINKS setup ' mkdir subdir && echo file >subdir/file && git add subdir/file && git commit -q -m file && git clone -q . clone-repo && ln -s clone-repo/subdir/ subdir-link && ( cd clone-repo && git config receive.denyCurrentBranch warn ) && git config receive.denyCurrentBranch warn ' # Demonstrate that things work if we just avoid the symlink # test_expect_success SYMLINKS 'pulling from real subdir' ' ( echo real >subdir/file && git commit -m real subdir/file && cd clone-repo/subdir/ && git pull && test real = $(cat file) ) ' # From subdir-link, pulling should work as it does from # clone-repo/subdir/. # # Instead, the error pull gave was: # # fatal: 'origin': unable to chdir or not a git archive # fatal: The remote end hung up unexpectedly # # because git would find the .git/config for the "trash directory" # repo, not for the clone-repo repo. The "trash directory" repo # had no entry for origin. Git found the wrong .git because # git rev-parse --show-cdup printed a path relative to # clone-repo/subdir/, not subdir-link/. Git rev-parse --show-cdup # used the correct .git, but when the git pull shell script did # "cd $(git rev-parse --show-cdup)", it ended up in the wrong # directory. A POSIX shell's "cd" works a little differently # than chdir() in C; "cd -P" is much closer to chdir(). # test_expect_success SYMLINKS 'pulling from symlinked subdir' ' ( echo link >subdir/file && git commit -m link subdir/file && cd subdir-link/ && git pull && test link = $(cat file) ) ' # Prove that the remote end really is a repo, and other commands # work fine in this context. It's just that "git pull" breaks. # test_expect_success SYMLINKS 'pushing from symlinked subdir' ' ( cd subdir-link/ && echo push >file && git commit -m push ./file && git push ) && test push = $(git show HEAD:subdir/file) ' test_done