簡體   English   中英

Git - 忽略對配置文件的特定修改

[英]Git - Ignoring a specific modification to a config file

我的項目中有一個配置文件,它包含一個到數據庫的連接字符串,以及幾個應用程序設置,例如:

...
<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忽略文件中的特定更改,但是如果發生任何其他更改,則將其標記為已修改? 或者是否有另一個類似的解決方案?

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

過濾器是為這樣的東西制作的。 在你的回購中,

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

我不認為git有這樣的設施。 並且提出的管理app.config文件的方法,處理部分文件版本控制和其他部分沒有,對我來說沒有味道。

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

我們缺乏關於開發設置的背景信息,以告訴我們如何實現這一切。 如果您正在使用makeant或類似的東西,那么這將是一個簡單的依賴項和規則來創建app.config以確保創建文件(如果它不存在或者構建配置文件或模板文件更改)。 此外,如何從模板文件生成app.config文件的自然選擇取決於您的構建環境和app.config文件的性質。 對於超過幾行文本,甚至可以使用shell腳本輕松擴展給定模板文件(擴展$ {VARIABLE}構造的幾行行,但如果文件需要包含美元則會變得更復雜標志或背蜱或反斜杠等)。 更復雜的擴展我們可以使用eruby ,或eperl或類似的東西(甚至可能是PHP )。 每當您需要更改設置時,也可以手動生成app.config文件。 但如果沒有進一步的背景,所有這些都是無用的推測。

讓我就如何做到這一點提出一些建議。

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

所有其他建議可能需要對架構進行更改,因此不能將其視為“僅限本地”的解決方案。 無論如何,我認為他們可能值得回顧。

所有更改的主要思想是將本地文件添加到.gitignore ,其中包含本地系統特定設置。 我們在這里使用了幾種略有不同的解決方

  • 您可以使用包含所有本地系統特定值的鍵值對的屬性文件。 該文件應手動更新。 然后將其用於應用程序並合並到應用程序配置中。 詳細信息取決於您使用的工具。 但我相信這不應該帶來任何重大困難,但很可能需要更改應用程序。
  • 您可以在git存儲庫中使用app-original.config文件,在git ignore list中使用app.config文件。 應該從app-original.config文件手動創建app.config文件。

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

我想我找到了解決這個問題的好方法。

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

我希望能夠使用修改版本的配置,但沒有將文件持續存儲在“已修改”文件列表中,並且不完全忽略其所有更改。

這就是我的工作

從服務器克隆后,我的日志圖如下所示:

A---B---C master

我的所有開發都將在另一個分支“開發”中完成。 所以我分支它。 然后我更改配置文件並更改連接字符串並提交。

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

接下來我簽出master並將更改合並回“--nocommit”標志。 然后在合並提交中,我恢復配置更改並提交。 實際上,我創建了一個空提交,它只是作為Git的通知,這些更改已合並,並且不需要再次合並它們。

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

現在,當我繼續在X上開發新功能時,我可以安全地將更改合並回master - Git將僅嘗試合並自上次合並以來的新更改。

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

所以在上面的例子中,只有“Y”和“Z”的變化將被合並回來。

我試過了,似乎工作正常。 但是,它確實意味着,每當我切換到主分支時,我將使用不正確的連接字符串配置,但由於我的大多數開發都是在“開發”分支上完成的,所以它看起來並不大問題給我。

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

UPDATE

這個問題是如果配置文件以任何方式更改為“master”,然后將“master”更改合並到“development”分支,那么配置文件將被覆蓋而不會發出警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM