2011-06-09 84 views
10

我試圖在一個存儲庫中保留2個網站項目。這個網站除了模板(html,css)文件和幾個配置文件外基本相同。 主要網站(這是我說的Supersite)在分支大師。第二個站點在分支secondarySite中。每次,當我在主分支中開發一些新功能時,我想將它合併到secondarySite,但我想從合併中排除模板文件。git - 如何從合併中排除文件

我在這裏找到了部分解決方案How do I tell git to always select my local version for conflicted merges on a specific file?但它只在我更改兩個分支中的模板文件和發生衝突時才起作用。當沒有衝突git只是使用較新的遠程版本的文件。

如何告訴git 總是即使沒有衝突,也可以保持指定的本地文件不變。

或者,也許我使用完全錯誤的方法來解決這個問題?

在此先感謝您的幫助。

+0

你有沒有找到解決辦法呢? – pvinis 2016-08-23 06:05:38

回答

3

您是否嘗試過使用.gitignore? git文檔中提供的詳細信息here

+3

感謝您的建議。問題是我需要跟蹤這兩個分支中的文件 - 我只想保留這個文件「特定分支」。 – Marcin 2011-06-09 15:25:11

6

my answer on merge drivers中所述,它們僅在衝突情況下才有用。
applies to a merge=ours in a .gitattributes file:見Merge strategies

一個非常有用的選項是通知Git不嘗試,當他們有衝突合併特定文件,而是在別人的使用合併的一面。

recent thread (2012)證實了這一點:

有沒有辦法合併來自branchA到branchB和branchB到 branchA而完全無視切換到正在跟蹤 和存在於兩個文件分支機構?

號從根本上說,在GIT中提交對象由一個內容狀態(即,一個指針指向一個樹對象)和指向所有以前的歷史的(即,零個或多個「父」提交對象的指針)。
一個提交對象的語義可以被認爲是「我已經查看了所有父提交中的所有歷史記錄,並且包含在我的樹指針中的狀態取代了它們全部」。

因此,您可以將B合併爲A,但保留A的文件副本(例如,使用「ours」策略)。但是這就是說你考慮了A和B的狀態,並且決定A的版本取代B中發生的情況。如果您後來想要從A合併到B,那麼B的文件版本甚至不會被視爲合併的結果。

通過不同的合併策略解決這個問題並不是一個聰明的方法;這是用於存儲歷史的git數據結構的一個基本方面。

如果這些模板位於子目錄中,最好將它們隔離到自己的git倉庫中,以便將該倉庫作爲子模塊包含在內。

如果沒有,那麼你需要恢復文件提交(如this thread)之前錯誤地合併:

git merge --no-commit other 
git checkout HEAD XYZ # or 'git rm XYZ' if XYZ does not exist on master 
git commit 
2

這裏的git更新索引 - 在工作樹索引寄存器文件內容。

git update-index --assume-unchanged <PATH_OF_THE_FILE> 

例子: -

git update-index --assume-unchanged somelocation/pom.xml

添加文件路徑中的.gitignore

1

或者,也許我用完全錯誤的做法,在PR oblem?

您使用完全錯誤的方式解決這個問題:)

的問題在於分支,和他們周圍的工具,是用來維護不同版本的同一標的事情

但你的兩個網站是不是真的相同的底層的東西,他們是兩個不同的東西有一些共性,而你有,因爲你躺在它關於他們的關係濫用飯桶。

你的理智選擇是:

  1. 讓你的回購代表宇宙中所有的(好吧,兩者)網站。因此,它們在相同的目錄結構中都可見並使用不同的路徑名。他們可能有單獨的開發和發佈分支,但它是可選的。如果這兩個網站有一些共同點,這可以只是共享文件的形式。

    例如。

    repo/supersite 
    repo/secondsite 
    repo/common 
    
  2. 爲每個網站製作單獨的回購,並複製通用文件。您可以複製更改

  3. 爲每個站點分別建立一個回購站點,爲常見項目製作第三個回購站,並使用子模塊在一個地方組合supersite + common,在另一個地方使用secondsite + common。

    例如。

    super-repo/site # super site content 
    super-repo/common # common repo as submodule 
    second-repo/site # second site content 
    second-repo/common # same common repo as submodule 
    

    注子模塊指的是同一回購,但每個實例都可以是目前在不同的分支或提交

在一定程度上是正確的選擇取決於有多少兩個站點獨立地變化,共享位的更改頻率以及強制這兩個站點使用相同版本的共享位以及共享內容的哪一部分與獨特等共用等等。

1

在每個您的分支機構,在roo中添加文件.gitattributes噸。

對於每個分支,指定的文件以合併這樣被忽略:

filename merge=ours 

不要忘記,以激活該驅動程序:

git config --global merge.ours.driver true 

嘗試合併,你會請參閱每個分支中.gitattributes中指定的文件在合併發生時不會受到影響。