2013-03-01 78 views
3

我對我們的項目配置文件用於保存連接字符串到數據庫,以及一些應用程序設置,如:混帳 - 忽略特定修改配置文件

... 
<setting name="ConnectionString"><value>Server=prodServer;Database=myDataBase;</value></setting> 
<setting name="AnotherSetting1"><value>Lorem</value></setting> 
<setting name="AnotherSetting2"><value>Ipsum</value></setting> 
<setting name="AnotherSetting3"><value>dolor </value></setting> 
... 

在我的發展,我總是將ConnectionString值更改爲我的本地數據庫,從而導致git將該文件標記爲「已修改」文件。

我讀到執行以下操作的選項:

git update-index --assume-unchanged app.config

然而,這將意味着,如果我做任何其他變動的文件(例如,改變AnotherSetting1),然後GIT中會忽略也是如此。

有沒有辦法告訴git忽略文件中的特定更改,但如果發生其他更改時將其標記爲已修改?還是有另一個類似的解決方案來解決這個問題?

請假設我無法對配置文件本身的架構進行任何更改 - 我想要一個本地解決方案。

回答

5

filters是這樣的東西。在你的回購中,

cat >.git/info/saved-connection <<EOD 
<setting name="ConnectionString"><value>Server=prodServer;Database=myDataBase;</value></setting> 
EOD 

cat >.git/info/my-connection <<EOD 
<setting name="ConnectionString"><value>Server=myprivateserver;Database=myDataBase;</value></setting> 
EOD 

git config filter.use-my-connection.smudge 'sed -f ".git/info/use-my-connection.smudge"' 
git config filter.use-my-connection.clean 'sed -f ".git/info/use-my-connection.clean"' 

cat >.git/info/use-my-connection.smudge <<EOD 
/^<setting name="ConnectionString">/ { 
    w .git/info/saved-connection 
    r .git/info/my-connection 
    d 
} 
EOD 

cat >.git/info/use-my-connection.clean  <<EOD 
/^<setting name="ConnectionString">/ { 
    w .git/info/my-connection 
    r .git/info/saved-connection 
    d 
} 
EOD 

echo >> .git/info/attributes  path/to/app.config filter=use-my-connection 
+0

我喜歡這個想法。謝謝! – VitalyB 2013-04-11 17:47:19

+0

:-)很高興它有幫助。我以前從來沒有使用過濾器,通過在這裏學習,謝謝回答atcha。 – jthill 2013-04-11 17:49:55

1

我不認爲git有這樣的設施。而提出的管理app.config文件的方式,處理部分文件版本受控,而其他部分不受控制,對我來說並不適合。

在你的情況下,我會尋求一種方式來安排從兩個文件生成app.configConnectionString設置將放置在用戶創建的(構建)配置文件中,其他部分將放入某種模板文件(概念上講)。用戶創建的配置文件可以添加到.gitignore文件中。模板文件將由git控制。我們需要通過將構建配置文件中的設置應用於模板文件來構建app.config文件。

我們缺乏關於開發設置的背景信息,以說明如何實現所有這些。如果您使用的是makeant或類似的東西,那麼這將是一個簡單的依賴關係和規則,用於創建app.config以確保文件在不存在或構建配置文件或模板文件更改時創建。同樣,如何從模板文件生成app.config文件的自然選擇取決於您的構建環境和文件的性質。對於比文本行更長的行,甚至可以使用shell腳本輕鬆簡單地擴展給定的模板文件(幾行代碼可以擴展$ {VARIABLE}構造,但如果文件需要包含美元跡象或背部蜱或反斜槓等)。更復雜的擴展我們可以使用erubyeperl或類似的東西(甚至可能是PHP)。只要需要更改設置,也可以手動生成app.config文件。但是,所有這些在沒有進一步的背景下都是無用的猜測。

+0

感謝您的回答,但是,我不能真正改變配置結構。而且,我真的只是好奇我怎麼能通過git解決它,或者如果它是可能的。我相信我現在用另一種方式解決了它(接受的答案)。如果您發現任何問題,請告訴我。 – VitalyB 2013-03-13 14:31:50

1

讓我提出一些建議,說明如何做到這一點。

向索引添加更改時,可以使用git add -p app.config並手動跳過文件中的某些更改。如果您在提交之前未對索引添加更改,則不會提交這些更改。這是一種「僅限本地」的解決方案。但總是看到在git status報告中修改的文件可能真的很無聊。

所有其他建議可能需要更改體系結構,因此不能將其視爲「僅限本地」解決方案。無論如何,我認爲他們可能值得回顧。

所有更改的主要想法是將本地文件添加到.gitignore,其中包含本地系統特定設置。我們在這裏使用了幾個稍微不同的解

  • 您可以使用包含所有本地系統特定值的鍵值對的屬性文件。這個文件應該手動更新。然後將其用於應用程序併合併到應用程序配置中。細節取決於您使用的工具。但我確實認爲這不應該引入任何重大困難,但很可能需要改變應用程序。
  • 你可以在git倉庫中有app-original.config文件,在git文件中可以有app.config忽略列表。應該從app-original.config文件手動創建app.config文件。

所有這些解決方案真正無聊的是,當配置文件的結構發生改變時,需要一些手動工作。例如,在每個配置文件更新中,您應該檢查是否引入了新屬性並更新您的本地屬性文件。此外,由於某些應用程序更改導致更新本地文件時,需要記住在配置文件中提交相關更改(請記住,本地文件位於.gitignore)。

+0

謝謝你的深刻解答。我用另一種方式解決了它(接受的答案)。如果您發現任何問題,請告訴我。 – VitalyB 2013-03-13 14:30:31

0

我想我找到了一個很好的解決方案來解決這個問題。

正如我所說的,在我的項目中有一個配置文件(錯誤地)將連接字符串存儲在該配置文件中。

我希望能夠使用配置的修改版本,但不會將文件始終保存在「修改」文件列表中,也不會完全忽略所有更改。

這是我做的

後,我從我們的服務器克隆我的日誌圖形看起來就像這樣:

A---B---C master 

我所有的發展將與另外一個分支,「發展」來完成。所以我分支它。 然後我更改配置文件並更改連接字符串並提交。

A---B---C master, origin/master 
     \ 
      X development 

接下來,我將checkout master結合到「--nocommit」標誌並將其合併。然後在合併提交中,我恢復配置更改並提交。實際上,我創建了一個空的提交,作爲通知Git,這些更改已合併,並且不需要再次合併它們。

A---B---C---D master, origin/master 
     \/
      X development 

現在我繼續在X開發新的功能,我可以放心地將更改合併回主人 - Git會只嘗試合併回自上次合併的新變化。

A---B---C---D---E---F master, origin/master 
     \/ /
      X---Y---Z development 

所以在上面的例子中,只有「Y」和「Z」的變化纔會被合併回來。

我試過了,它似乎工作正常。但是,它的意思是,每當我切換到主分支時,我將會得到具有不正確連接字符串的配置,但由於我的大部分開發都是在「開發」分支上完成的,因此它看起來不像一個大問題給我。

如果我的解決方案有任何問題,請在評論中告訴我。

UPDATE

有這方面的一個問題是,如果配置文件被更改,以任何方式,對「主人」,然後合併「主人」變爲「發展」分支,然後配置文件會被覆蓋而不會發出警告。

+1

好吧,如果你不能或不想改變'app.config'在存儲庫中的存儲/內置方式,這似乎是可行的方法。另一種方法是在私有'development'中完成所有工作,當想要將所做的更改合併到'master'時,首先在'development'上執行'git rebase -i master'並將'X'移到頂部。然後在'master'上做'git merge --ff development ^'。基本上你的提交'X'會浮在頂部,永遠不會合併到origin/master。好處是不會在你的'master'中出現這些醜陋的合併提交(for'X'和後續合併)。 – FooF 2013-03-14 05:48:56