2014-01-23 19 views
15

我知道可以設置覆蓋用戶級配置的per-repo配置(即/path/to/my/repo/.gitconfig覆蓋~/.gitconfig)。是否可以設置覆蓋給定文件夾的所有子文件夾的用戶級別設置的git配置?即,我有設置所有子文件夾的git config值

|--topLevelFolder1 
|--\ 
| ---.gitconfig_override 
|--\ 
| ---childFolder1 
|  \---[...] 
|--\ 
| ---childFolder2 
|  \---[...] 

而且我想在.gitconfig_override定義的設置在childFolder1childFolder2適用。

我對此的動機如下:我有一臺工作筆記本電腦,我也在空餘時間用於個人項目。我所有的工作代碼嵌套在一個文件夾中。當我推動git repos工作時,我需要使用我的工作角色 - 工作登錄名稱而不是名稱,以及工作電子郵件。當我推送自己的個人(github)回購協議時,我想用我的真實姓名和個人電子郵件來完成。我想過的

其他可能的解決方案(和問題):

  • 創建「工作」的獨立用戶和「玩」,適當地設置他們的用戶級別設置,並登錄爲相應的用戶當我切換上下文(麻煩,加上我可以輕鬆忘記切換)
  • 創建一個腳本,在「workFolder」內搜索git repos,並添加/更新其.gitconfig文件以保存適當的細節(如果我創建了一個repo並忘記在推之前運行腳本,我會推錯爲錯)
  • 「hack」git這樣每次它cr它會檢查文件路徑,並在適當的情況下更新.gitconfig文件(複雜,凌亂,幾乎可以肯定是錯誤的做法 - 另外,我不會有第一條線索如何去做)!

我檢查了this question,它似乎只包含單個回購的解決方案,而不是多個。希望有人會看到這個問題誰錯過了那個!

+0

你會在同一個倉庫裏工作都「工作,你」和「個人你「?如果不是,你鏈接的問題包含我給的答案。您的'--global'用戶設置應該包含您使用的更多身份。應該使用其他身份的每個存儲庫都應該具有相應的'user.name'和'user.email'。 – Chris

+0

我永遠不會與兩個不同的用戶一起工作 - 每個回購將是「工作」或「回家」 - 但問題來自於(對於工作,至少)我有類似於35回購的事實,並且定期增加。我可以在每個現有的回購站中添加'user.name'和'user.email'設置,並設置一個cron腳本將它們添加到任何新添加的回購站中,但如果可以將它們設置爲一個「過濾」到子文件夾中的任何回收站的地方。 – scubbo

回答

7

編輯:Git 2.13引入conditional includes,其目的是解決這個確切的問題。

我的原始答案保存在下面,爲了歷史的緣故(用戶堅持舊版本的git)。

====================================

你想要的確切行爲不支持,基於閱讀gitconfig的手冊頁。

然而,由於git 1.7.12,GIT中讀取來自four different sources配置數據,其中的兩個是用戶特定的:

$XDG_CONFIG_HOME/git/config~/.gitconfig~/.gitconfig中的條目將覆蓋$XDG_CONFIG_HOME/git/config中的條目。

這意味着您可以將您的個人gitconfig存儲在$XDG_CONFIG_HOME/git/config中,並將機器特定的替代置於~/.gitconfig中。類似於

[user] 
    email = [email protected] 

~/.gitconfig應該涵蓋您的電子郵件案例。

請注意,如果$ XDG_CONFIG_HOME沒有設置,git會尋找~/.config/git/config

這很適合我,因爲我只對工程機械兩個人回購(我的emacs的配置和我的點文件)。如果您經常向工作機器添加個人回購,這對您而言可能不夠好。

在這種情況下,圍繞git initgit clone定製包裝將是您最好的選擇。

您的$ PATH中名稱與'git- *'匹配的任何二進制文件都可以作爲git命令調用,因此您只需要一對shell腳本,它們通過所有傳遞的參數調用原始命令,然後複製正確的配置文件到.git/config

+0

某些git設置可以通過設置環境變量來控制。它們覆蓋配置文件中的值。 「direnv」是一個非常好的實用程序,用於設置/取消設置每個目錄層次結構的env變量。所有細節見以下答案。 –

4

git config中的[include]部分(.git/config,~/.gitconfig ...)是您正在尋找的。

[include] 
    path = /path/to/foo.inc ; include by absolute path 
    path = foo ; expand "foo" relative to the current file 
    path = ~/foo ; expand "foo" in your $HOME directory 

詳細信息,回答問題:Is it possible to include a file in your .gitconfig

見混帳配置文件:http://git-scm.com/docs/git-config#_includes

編輯

添加在childFolder1/.git/configchildFolder2/.git/config

[include] 
    path = ../.gitconfig_override 
+0

好的 - 所以這解決了只在一個地方(在'../。gitconfig_override'中定義'user.name'和'user.email')的問題,但我不認爲它實際上回答了原始問題?如果'childFolder1'和'childFolder2'是'parentFolder'的子節點,我正在尋找一種方法來設置'parentFolder'中的配置值,該配置值將過濾到以子文件夾爲根的任何回購站。 – scubbo

8

可以使用direnv命令來設置應用於所有子文件夾的環境變量。您可以位於該目錄層次結構的任何位置。如果您嘗試設置的git設置可以由環境變量控制,那麼您很幸運。

閱讀http://direnv.net/direnv基本頁面將其設置爲你的shell。對於zsh,這很簡單,只需將此行粘貼在我的.zshrc的底部並重新啓動外殼即可。

eval "$(direnv hook zsh)" 

檢查您想要的git設置是否可以通過環境變量進行控制。看來你要控制author.email特定目錄樹,它是通過設置GIT_AUTHOR_EMAIL控制。環境變量優先於配置。環境變量混帳讀取的完整列表在這裏:https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables

作爲,direnv的頁面指定,在層次結構的根目錄中創建一個文件.envrc,你的情況topLevelFolder1

例如:

echo export [email protected] > .envrc 

「允許」的envrc:direnv allow .這就是它!

每當您跳入層次結構時,direnv都會找到所述的.envrc文件並加載它。

$ cd ~/topLevelFolder1/childFolder1/project_name 
direnv: loading ../../../.envrc 
direnv: export +GIT_AUTHOR_EMAIL 

$ echo ${GIT_AUTHOR_EMAIL} 
[email protected] 

跳出DIR-結構和direnv將卸載這些變量

cd ~ 
direnv: unloading 
+1

這對我來說非常合適,謝謝! – MatanRubin

3

正如NateEag's edit提到,Git的Conditional Includes是爲這個完美的。既然答案是git < 2.13上的人的答案,那麼對於那些有更新版本的人來說,這個答案就是這樣。

首先,地方創建一個新的配置文件與要生效的子文件夾的設置 - 使用原來的問題的文件夾,讓我們說這是在~/topLevelFolder1/.gitconfig_include

~/.git/config,添加:

[includeIf "gitdir:~/toplevelFolder1/"] 
    path = ~/topLevelFolder1/.gitconfig_include 

~/topLevelFolder1的任何子文件夾現在都會包含在~/toplevelFolder1/.gitconfig_include中的配置 - 無需手動更改每個子文件夾回購中的.git/config。 (這不覆蓋無論是在子文件夾中的配置 - 它只是增加它,「包括」暗示。)

相關問題