2011-07-13 69 views
0

如果指定GIT_DIR =「。git2」,則它只會將其指定爲相對於當前目錄。在這種情況下,它不會執行「搜索直到包含'.git2'」協議的第一個父目錄,就像它使用默認的'.git'一樣。如何*完全*指定不同的'.git'目錄

另外,如果您指定完整路徑(如/home/me/project/.git2),則它不會將文件添加到資源庫中的相對於'.git2'位置的路徑中。

所以這個問題 - 有沒有一種方法可以將文件夾名稱替換爲除.git之外的其他名稱,並使協議的所有其他方面的工作方式與默認的.git完全相同' 名稱 ???

+0

你爲什麼要這樣?一點點的背景可能會幫助我們一點點。 – tjameson

+0

一般情況下,想知道有偏見:) – peterk

+0

但是:在這種情況下,我有一個私人內部和一個公共回購協議,並希望保持它們同步和分開,但都植根於同一棵樹。理想的情況是,如果可以爲特定存儲庫分配「被剔除的」子集,那麼當「公共」用戶訪問它時,它只會包含來自特定分支的數據而不是完整的歷史記錄,但是,因爲git將事物壓縮到非分支特定的分發包包含了自從版本庫誕生以來所有的所有歷史記錄,這在git中顯然是不可能的。 – peterk

回答

1

如果你想爲特定的存儲庫這樣做:

export GIT_DIR=/home/me/project/.git2 
export GIT_WORK_TREE="$(dirname "${GIT_DIR}")" 
git ... 

或:

git --git-dir=/home/me/project/.git2 --work-tree=/home/me/project ... 

如果要處處改變的Git目錄的默認名稱,你可以做一些令人費解像這樣:

git() (
    # if GIT_DIR is set, honor it 
    [ -z "${GIT_DIR+set}" ] || { command git "[email protected]"; exit $?; } 

    # find GIT_DIR 
    GIT_DIR=$(
     : "${GIT_DIR_NAME=.git2}" 
     while true; do 
      [ -d "${GIT_DIR_NAME}" ] && { 
       printf '%s\n' "${PWD%/}/${GIT_DIR_NAME}" 
       exit 0 
      } 
      [ "$(pwd -P)" !=/] || { 
       echo "fatal: Not a git repository" >&2 
       exit 1 
      } 
      cd .. || exit 1 
     done 
    ) || exit 1 

    # set GIT_WORK_TREE based on GIT_DIR if it is not already set 
    [ -n "${GIT_WORK_TREE+set}" ] || { 
     GIT_WORK_TREE=$(dirname "${GIT_DIR}") || exit 1 
    } 

    # run the actual git with the discovered directories 
    GIT_DIR=${GIT_DIR} GIT_WORK_TREE=${GIT_WORK_TREE} command git "[email protected]" 
) 

以上,當你運行git foo它會搜索h代替.git2而不是.git。對於工作目錄,它將使用包含.git2的目錄。

+0

謝謝 - 我猜腳本是做什麼的。 – peterk

1

所以現在的問題 - 有沒有辦法來代替文件夾名稱Git使用一些其他的名字不是「git的」,並有協議工作的所有其他方面完全一樣,因爲他們與默認做「 .git'name ???

我不認爲有什麼辦法可以做到這一點。爲什麼不將.git2的完整路徑設置爲GIT_DIR,並且還設置了GIT_WORK_DIR的完整路徑?有關GIT_WORK_DIRGIT_DIR如何確定工作目錄和git目錄的頂部的規則很複雜且很容易出錯。如果你設置了兩個(並將它們設置爲絕對路徑),那麼你通常會有更少的問題。