2011-05-17 54 views
34

我有一些包含幾個子模塊的git存儲庫的問題。Git子模塊和ssh訪問

超級git倉庫與命令

mkdir projectname 
cd projectname 
git init 
git submodule add ssh://[email protected]/pathtorepos 

構建在不同的用戶(「otheruser」),然後克隆超級倉庫一切似乎都工作了。但是,當它的時間去子模塊接入

git submodule init 
git submodule update 

混帳嘗試使用「名爲myUsername」而不是「otheruser」克隆子模塊。

如何解決這個問題?

回答

31

如果可能的話,最好確保了.gitmodules文件包含任何人都可以克隆,通常是一個git://http:// URL庫的URL。然後有SSH訪問用戶自己可以在remote.origin.url克隆後變成的子模塊,並更改URL指向一個SSH的網址與自己的用戶名,例如:

cd my-submodule 
git remote set-url origin [email protected]:/pathtorepos 

其他用戶應該能夠做到這一點,即使在目前的情況。 更新: Chris Johnsen指出,如果您省略用戶名並且存儲庫的所有用戶都具有SSH訪問權限,那麼在.gitmodules中使用SSH URL也是合理的 - 他們需要添加他們的用戶名,類似於上述if它在本地和遠程有所不同。

請注意,.gitmodules中的URL僅在初始化子模塊時使用。初始化子模塊會將主項目中的配置值submodule.<SUBMODULE-NAME>.url設置爲.gitmodules中提交的任何內容 - 這是將在第一個子模塊更新中使用的值。初始化和更新子模塊之間,你也可以改變這個網址將被用於該第一次更新的命令,如:

git config submodule.my-submodule.url [email protected]:/pathtorepos 

事實上,你可能需要做,如果第一次更新失敗。一旦子模塊第一次更新,您需要更改的URL是在子模塊中爲origin定義的URL - 此時,如果您可能正在刪除,則只在主項目中設置submodule.my-submodule.url配置值並重新更新子模塊。

+3

如果它們不包含用戶名(每個用戶名都有),那麼在'.gitmodules' **中使用基於SSH的URL是合理的最終用戶可以配置'.ssh/config'來提供他們自己的服務器用戶名,如果它不同於他們的本地用戶名)。其次,'git submodule init'將子模塊條目從'.gitmodules'複製到'.git/config',所以有一點(在'init'之後,但在第一次使用'git submodule update'之前),你可以在克隆之前重新配置子模塊的URL。如果這些子模塊已經被克隆,你的'(cd sub && git config remote.origin.url ...)'(也是)需要的。 – 2011-05-19 09:52:03

+0

@克里斯約翰森:我已經添加了關於你的第一點的說明 - 謝謝。我很清楚後一點,但我一直在努力努力保持子模塊上的答案簡單,所以它們不會全部變成[漫不經心的博客文章](http://longair.net/blog/2010/06/02/git-submodules-explained /)關於你的子模塊可以處於的所有不同狀態...無論如何,我會更新這個答案來描述這種情況,以及:( – 2011-05-19 10:41:44

+0

好吧,我希望改進現在, – 2011-05-19 11:00:40

8

其他用戶必須更改.git/config文件以將用戶名更改爲他自己的用戶名。這樣,git使用正確的用戶連接到服務器。

[submodule "path/to/module"] 
    url = ssh://[email protected]/pathtorepos 
2

僅供參考,我最終使用的解決方案如下。 其他人可以檢出現有的存儲庫。

當我需要檢查資源庫,就用下面的命令

git clone ssh://[email protected]/path/to/superrepos 
cd superrepos 
git submodule init 
git submodule update 

做給別人看看超級庫,使用以下命令集。 唯一的區別是其他倉庫的手動克隆

git clone ssh://[email protected]/path/to/superrepos 
cd superrepos 
git clone ssh://[email protected]/path/to/other/repos 
git submodule init 
git submodule update 

注意,發出

git submodule init 

命令後,git會告訴你所請求的資源庫和可用的是不相同的。但這不是致命的,你可以安全地繼續。

+1

或者init,reconfigure,然後更新:'...; cd superrepos; git submodule init; git config submodule.name.url ssh://[email protected]/path/to/other/repos; git submodule update '。 – 2011-05-19 09:58:06

0

請勿在URL中包含用戶名。當你克隆/拉/ etc時,git會提示輸入用戶名和密碼。

1

爲了在一個開源項目中解決這個問題,我們在.gitmodules文件中輸入一個RELATIVE URL。這將導致git根據父項目的URL模式克隆的URL克隆子模塊URL。使用相對路徑整齊地避免了完全指定協議(https,ssh)和用戶名:

[submodule "my/tests/schemas"] 
    path = my/tests/schemas 
    url = ../my-schema 

p.s.發佈後,我意識到我的答案是一個騙局,這裏是你應該使用的來源:Automatically access submodule via ssh or https