2014-07-22 66 views
8

TLDR;這將是一個冗長的帖子,但我相信很多unity3d開發者也遇到了同樣的問題。一個問題需要一個明確的,一勞永逸的答案來保存我們的集體理智。unity3d和git子模塊有可能嗎?

所以我在過去的2年中一直使用git,但我還沒有深入到這個過程中。我可以分支/合併來自bitbucket/github等的push pull,並且對於常規的獲勝表單/傳統應用程序來說工作得很好。

這是問題所在。我很久以前從xna/silverlight移到unity3d並統一爲了添加一個對庫的引用,你實際上必須將源庫中的源文件複製到你的unity項目文件夾中。雖然unity允許你將* .dll文件放入Plugin文件夾,但是有明顯的跨平臺兼容性問題,因此我從不想去那裏。

我有十幾個圖書館項目,提供從AI到內容管理,日誌記錄,抽象用戶輸入系統等各種功能,我一直在爲將來的遊戲製作新的關卡編輯器。

每個單獨庫項目它的自我是一個整體項目,每個項目的代碼文件團結這樣

Assets\<company name>\<project name>\ 
Assets\<company name>\<library name>\ 
Assets\<company name>\<another library name>\ 

我這樣做是爲了讓事情不像許多是其他資產的高度組織化的組織在統一資產商店。 :(

所以我的關卡編輯器項目使用了多個庫項目,其代碼已經通過複製粘貼導入,每個庫本身都託管在自己的本地git存儲庫中,所以當我從庫中複製粘貼代碼文件項目我的主要單位的項目,我會自動丟失任何提交更改的能力我做出了圖書館混帳回購協議。

我一直在這個去年做什麼一直休耕

  1. 開始主體工程Assets\<company name>\<main project name>\
  2. 導入任何庫項目(複製/粘貼代碼文件)Assets\<company name>\<library name>\
  3. 如果我需要對其中一個庫進行更改,通常只需編輯我正在處理的主項目中的庫代碼文件。 (否則更復雜)
  4. 因爲主項目也是一個git倉庫,所以我對任何庫文件所做的更改也會被承諾到主項目的倉庫。
  5. 經過一段時間,我使用CodeCompare(diff實用工具)對Assets\<company name>\<library name>\進行文件夾比較,以及之前從中複製庫文件的庫的原始位置。
  6. 我刻意比較每個更改的代碼文件差異,並將我在主項目中所做的更改遷移到庫的原始位置。
  7. 既然這樣做了,庫就是一個git repo(第二次)我必須對代碼文件進行的各種更改進行提交。

隨着這種瘋狂,這裏還有另一個問題。主要項目不是我現在正在進行的唯一主要項目。我有幾個項目都參考(通過複製/粘貼)這些其他庫。所以,現在我已經更新了庫的代碼並提交了它,現在我必須回顧使用庫的每個主項目,並將庫git repo中的更改複製/粘貼到這些主項目。

工作流量從summerized複製LibraryA-

MainProjectA->代碼文件>改性內部MainProjectA->通過DIFF比較合併LibraryA的文件返回到原來的文件夾LibraryA的位置 - > LibraryA的代碼文件,然後複製回LibraryA的文件其他使用LibraryA IE的項目:MainProjectB,MainProjectC,MainProjectD。

好主!隨着我的各種項目越來越大,這個問題越來越複雜。這個系統可以工作,但是非常非常繁瑣。

中止

所以有點咆哮。/TakesDeepBreath/sigh我拒絕使用git命令行。它發生在1980年代的MS-DOS ala。這是20人驚嚇了14人。 2014年和我們的開發人員仍然在用命令行開玩笑。在這個時代,我期待更多。我不是基本上學習一種全新的命令行語言,更不用說必須在Windows和應用程序之間切換回來和第四步,只是爲了做一些基本上簡單的事情,比如提交代碼更改。只需要2-3次快速點擊鼠標和一個簡短的輸入信息就可以完成所有需要的操作。 git = new hawtness +不必要的命令行復雜度

話雖如此,我經常使用內置的vs2013 git功能進行提交和分支/合併等。但它似乎並不支持子模塊,據我所知。因此,我使用SourceTree。

End End。

輸入git的子模塊地獄

就像我說的,我還沒有使用Git的很多超越它的基本核心功能,我還只能通過測試的項目進行初步測試,但我不能讓git的可靠的工作方式我需要它並且經常在使用子模塊時會出現一些混淆,並且由於各種錯誤而經常不會提交。

我想要做的就是這個

  1. 創建一個名爲MainProjectA新的團結項目,使之成爲當地的回購
  2. git的子模塊(縣)MainProjectA從LibraryA的(本地回購),LibraryB添加(本地回購)等
  3. 如果我在MainProjectA內部更改與LibraryA相關的代碼文件,我希望能夠在MainProjectA內將這些特定更改提交回LibraryA的回購。

我甚至已經開始編寫一個實用程序,該程序會在檢測到更改後立即自動同步2個不同文件夾之間的文件。但我放棄了它,因爲雖然它可以解決同步問題,但它不會解決git commit問題。

另一個問題是,有一個本地回購所有現有統一項目設置爲休耕

<Unity Main Project Folder> 
    |- .git 
    |- Assets 
    |-Company Name 
     |- MainProjectA 
    |- Library 
    |- ProjectSettings 
    |- .gitignore 

<Unity LibraryA Folder> 
    |- .git 
    |- Assets 
    |-Company Name 
     |- LibraryA 
    |- Library 
    |- ProjectSettings 
    |- .gitignore 

我想要做的就是在我的主要項目LibraryA的文件夾,那是我LibraryA的一個子模塊項目,更具體地說我想只有<Unity LibraryA Folder>\Assets\Company Name\LibraryA\內容被包括在我的主要項目文件夾的子模塊<Unity Main Project Folder>\Assets\Company Name\LibraryA\

<Unity Main Project Folder> 
    |- .git 
    |- Assets 
    |-Company Name 
     |- MainProjectA 
     |- LibraryA (submodule) 
    |- Library 
    |- ProjectSettings 
    |- .gitignore 

但SourceTree/git的抱怨,我不能一個子模塊添加到現有的回購FOL DER。 <Unity Main Project Folder>\Assets\Company Name\

我打算繼續寫作,但是......我認爲這已經足夠寫作了,現在我的目標應該足夠好地描述了。

結論

我想我也可以問天氣Git有足夠成熟的產品,它甚至可以讓我做什麼,我試圖做的?或者,考慮到git的架構來支持我想要做的事情,這是不是可能?

每個搜索都已經空了,YouTube沒有任何幫助和浪費時間,更不用說我能找到的每個例子都是一個命令行示例,並且不會觸及子模塊。

在正常的Windows應用程序中,子模塊不會成爲問題。問題的具體表現在團結如何讓它的項目中包含所有代碼文件。這和我如何試圖保持我的有組織的文件夾結構完好無損。

請幫忙。請。珀迪請。我求求你!我求求你!在我的FRIEAKIN KENES BEGGING上! :P

+1

子模塊是邪惡的。只是谷歌它。你爲什麼不爲你的庫創建dll並使用類似NuGet來管理版本和下載dll?你甚至可以獲得編譯時間,因爲Unity不需要編譯每次保存文件時所做的每件事(順便說一句,你不需要dll來避免更長的編譯時間,你可以通過將代碼放入Plugins文件夾:\ Assets \ Plugins \ ...) – Roberto

+0

對於大多數Unity項目,我使用PureMVC的C#端口。這是一個DLL,並且適用於iOs,Android,Mac和Window的項目。 否則爲什麼不使用unitypackage導入/導出機制?資產商店的所有插件都使用它來分發其內容。我用它來將資產從一個項目轉移到下一個項目,並且它似乎正常工作。 –

+1

這就像我最喜歡的stackoverflow問題!很好地表達和說明,以及我正在處理的內容。自從兩年前發佈這個問題以來,您是否找到任何新的解決方案或獲得了有關此問題的其他見解? – Junuxx

回答

3

也許你想使用符號鏈接/硬鏈接?

<Master Project Folder> <----- no .git here 
| 
|-<Unity Main Project Folder> 
| |- .git 
| |- Assets 
|  |-Company Name 
|  |- MainProjectA 
|  |- LibraryA   ------ symlink to --+ 
|  |- .gitignore <--------+    | 
| |- Library     |    | 
| |- ProjectSettings   add LibraryA | 
| |- .gitignore        | 
|            | 
|-<Unity LibraryA Folder>      | 
| |- .git          | 
| |- Assets         | 
|  |-Company Name       | 
| |- LibraryA  <-------------------------+ 
| |- Library 
| |- ProjectSettings 
| |- .gitignore 

儘管Unity抱怨符號鏈接,但這應該可行。至少在OSX上。


另一個(IMO和更正確的)方法是讓LibraryA作爲一個子模塊,並有一個單獨的測試項目爲它(目前你Unity LibraryA Folder)。

我已經在這個設置(2-3鏈接的存儲庫)中完成了2+年,並且git表現良好。也許你的圖形客戶端不太好?試試gitx-dev或者github的桌面客戶端(它也適用於非github倉庫) - 或者只是學習命令行,它可以工作。

哦,以及將子模塊添加到現有目錄的問題 - 先刪除目錄並提交。

+0

我不明白你如何符號鏈接LibraryA的「LibraryA」文件夾。我知道您希望LibraryA顯示在主項目的assets文件夾下,但LibraryA項目不會編譯到名爲LibraryA的文件夾。 LibraryA的所有資產都將保留在其Assets文件夾中,並且編譯的內容將最終放到LibraryA的「Library」文件夾中,但它們最終不會放在名爲「LIbraryA」的文件夾中。所以你的圖表不完全正確,或者我不明白Unity如何工作。 –

-2

我一直處於與Unity相同的狀況。老實說,你想要做的就是避免使用Git,並使用SVN和Externs。 Git SubModules實際上不是你從個人經驗中尋找的東西,也沒有辦法使它們的行爲完全符合你對Unity的要求。 Git與SVN相比有很多優勢,但是SubModules絕對不是其中之一。

然而,SVN Externs的工作方式與您想要的完全一樣。您可以將LibraryA回購庫中的特定文件夾直接簽入您的主回購庫。從那裏幾乎每一個我用過的SVN客戶端(我在OS X上,我使用Cornerstone)允許你直接更新和提交該extern文件夾,這將修改實際的LibraryA庫。另外,當你在主庫的基礎上進行更新時,你所有的extern也會被更新。如果你需要分支你的項目,你可以將extern指向特定的版本而不是頭部。

0

這是我所做的。

首先 - 如果您已將LibraryA的文件複製到您的項目中,並且您的項目正在使用LibraryA的對象&腳本,則必須非常小心。確保你從Git倉庫中完全沒有任何修改,當你開始...

現在,隨着Unity關閉,去消滅你的項目包括的LibraryA文件夾。團結,如果它是開放的,在這一點上會開始窒息並死亡。

現在,在您的項目中的Assets文件夾中創建一個硬鏈接目錄(mklink/J文件夾目標),該文件夾將排隊並模仿剛剛刪除的文件夾。新的硬鏈接必須看起來幾乎完全像你剛剛刪除的內容。

在Unity中打開您的項目。如果幸運的話,當它完成導入資產時,它仍然會在正確的位置放置正確的對象,但它會更新一個庫文件夾中的東西。沒關係。

請確保在Git中表示LibraryA的回購沒有更改文件。只要將該目錄與其中的硬鏈接導入到LibraryA中,就不應觸及LibraryA的文件。如果是這樣,你可能做錯了什麼。

檢入項目庫文件夾中的所有新更改。

現在你可以在Unity中繼續開發了。

呃,希望。