Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
git: run in a directory given with -C option
This is similar in spirit to "make -C dir ..." and "tar -C dir ...".
It takes more keypresses to invoke git command in a different
directory without leaving the current directory:
1. (cd ~/foo && git status)
git --git-dir=~/foo/.git --work-dir=~/foo status
GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
2. (cd ../..; git grep foo)
3. for d in d1 d2 d3; do (cd $d && git svn rebase); done
The methods shown above are acceptable for scripting but are too
cumbersome for quick command line invocations.
With this new option, the above can be done with fewer keystrokes:
1. git -C ~/foo status
2. git -C ../.. grep foo
3. for d in d1 d2 d3; do git -C $d svn rebase; done
A new test script is added to verify the behavior of this option with
other path-related options like --git-dir and --work-tree.
Signed-off-by: Nazri Ramliy <ayiehere@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>- Loading branch information
Showing
3 changed files
with
109 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| #!/bin/sh | ||
|
|
||
| test_description='"-C <path>" option and its effects on other path-related options' | ||
|
|
||
| . ./test-lib.sh | ||
|
|
||
| test_expect_success '"git -C <path>" runs git from the directory <path>' ' | ||
| test_create_repo dir1 && | ||
| echo 1 >dir1/a.txt && | ||
| (cd dir1 && git add a.txt && git commit -m "initial in dir1") && | ||
| echo "initial in dir1" >expected && | ||
| git -C dir1 log --format=%s >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_expect_success 'Multiple -C options: "-C dir1 -C dir2" is equivalent to "-C dir1/dir2"' ' | ||
| test_create_repo dir1/dir2 && | ||
| echo 1 >dir1/dir2/a.txt && | ||
| git -C dir1/dir2 add a.txt && | ||
| echo "initial in dir1/dir2" >expected && | ||
| git -C dir1/dir2 commit -m "initial in dir1/dir2" && | ||
| git -C dir1 -C dir2 log --format=%s >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_expect_success 'Effect on --git-dir option: "-C c --git-dir=a.git" is equivalent to "--git-dir c/a.git"' ' | ||
| mkdir c && | ||
| mkdir c/a && | ||
| mkdir c/a.git && | ||
| (cd c/a.git && git init --bare) && | ||
| echo 1 >c/a/a.txt && | ||
| git --git-dir c/a.git --work-tree=c/a add a.txt && | ||
| git --git-dir c/a.git --work-tree=c/a commit -m "initial" && | ||
| git --git-dir=c/a.git log -1 --format=%s >expected && | ||
| git -C c --git-dir=a.git log -1 --format=%s >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_expect_success 'Order should not matter: "--git-dir=a.git -C c" is equivalent to "-C c --git-dir=a.git"' ' | ||
| git -C c --git-dir=a.git log -1 --format=%s >expected && | ||
| git --git-dir=a.git -C c log -1 --format=%s >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_expect_success 'Effect on --work-tree option: "-C c/a.git --work-tree=../a" is equivalent to "--work-tree=c/a --git-dir=c/a.git"' ' | ||
| rm c/a/a.txt && | ||
| git --git-dir=c/a.git --work-tree=c/a status >expected && | ||
| git -C c/a.git --work-tree=../a status >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_expect_success 'Order should not matter: "--work-tree=../a -C c/a.git" is equivalent to "-C c/a.git --work-tree=../a"' ' | ||
| git -C c/a.git --work-tree=../a status >expected && | ||
| git --work-tree=../a -C c/a.git status >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_expect_success 'Effect on --git-dir and --work-tree options - "-C c --git-dir=a.git --work-tree=a" is equivalent to "--git-dir=c/a.git --work-tree=c/a"' ' | ||
| git --git-dir=c/a.git --work-tree=c/a status >expected && | ||
| git -C c --git-dir=a.git --work-tree=a status >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_expect_success 'Order should not matter: "-C c --git-dir=a.git --work-tree=a" is equivalent to "--git-dir=a.git -C c --work-tree=a"' ' | ||
| git -C c --git-dir=a.git --work-tree=a status >expected && | ||
| git --git-dir=a.git -C c --work-tree=a status >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_expect_success 'Order should not matter: "-C c --git-dir=a.git --work-tree=a" is equivalent to "--git-dir=a.git --work-tree=a -C c"' ' | ||
| git -C c --git-dir=a.git --work-tree=a status >expected && | ||
| git --git-dir=a.git --work-tree=a -C c status >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_expect_success 'Relative followed by fullpath: "-C ./here -C /there" is equivalent to "-C /there"' ' | ||
| echo "initial in dir1/dir2" >expected && | ||
| git -C dir1 -C "$(pwd)/dir1/dir2" log --format=%s >actual && | ||
| test_cmp expected actual | ||
| ' | ||
|
|
||
| test_done |