2012-11-17 111 views
4

假設有文件夾結構,如:如何從其他目錄使用git?

repos 
    /repo1 <-- here is git repository 

我做的:

cd repos 

我怎麼能現在使用/repo1庫仍處於repos目錄是?我不想做

cd repo1 
git status (...) 
git commit (...) 
... 

但類似:

git --git-dir=repo1 (...) 

git --work-tree=repo1 (...) 

我想做在樣式的所有 Git命令,事件git init。什麼是正確的方法?

+0

出於好奇:你爲什麼想這樣做? –

+0

,因爲我想從一個腳本中的一個位置對許多版本庫進行微操作 – bartek

+0

難道你不能在腳本中來回跳轉工作目錄嗎?你似乎有他們的路徑。你也可以通過'cd -'來「撤消」最後一張光盤(即回到上一個工作目錄)。 –

回答

4

您可以設置環境變量$GIT_DIR。看看它。

+0

我沒有檢查你的解決方案,但嘗試了--git-dir和--work-tree並開始工作。但是另一個問題出現了:當我在'/ repo1'中使用相對路徑使用遠程倉庫時,則從另一個目錄('repos')對倉庫'/ repo1'進行操作會導致這個相對路徑不被保留;它是從我操作的文件夾計算得出的。 – bartek

0

您可以結合--git-dir--work-tree到當前目錄之外的回購操作:

git --git-dir=/some/other/dir/.git --work-tree=/some/other/dir status 

您還可以設置GIT_DIR爲@opqdonut提到的,但你也必須設置GIT_WORK_TREE。請注意,GIT_DIR是目標存儲庫中.git目錄的路徑,而GIT_WORK_TREE是目標存儲庫本身。

這一切真的很方便,但這裏有一個外殼的功能,將讓您的生活更輕鬆:

function git-dir() { 
    dir=$1 
    shift 
    git --git-dir="$dir/.git" --work-tree="$dir" $* 
} 

這將Bash或巖組(也可能是其他的Bourne衍生彈)工作。把它放在你的~/.bashrc~/.zshrc或適合你的環境的地方。

然後,你可以這樣做:

git-dir /some/other/dir status 

status是任何的Git命令。它與其他參數爲好,這是直接傳遞給git命令:

git-dir /some/other/dir remote -v 
1

的Git有-C <path>選項(如tar -C <path>)改變了Git的工作目錄path,然後在該目錄中執行命令。舉例來看:

$ mkdir gitrepo 
$ git -C gitrepo init 
Initialized empty Git repository in /home/foo/gitrepo/.git/ 

man git

-C <path>

運行彷彿蠢貨,<path>,而不是當前的工作目錄開始。當給出多個-C選項時,每個隨後的非絕對-C <path>被解釋爲相對於前面的-C <path>

此選項會影響路徑名稱如--git-dir--work-tree的選項,因爲它們將對路徑名稱的解釋相對於由-C選項導致的工作目錄做出。例如下面的調用是等效的:

git --git-dir=a.git --work-tree=b -C c status 
git --git-dir=c/a.git --work-tree=c/b status 

我的Git版本是2.16.1。