2017-01-20 24 views
1

我有一個文件在開發過程中被跟蹤,並被推送到遠程上游回購站,以便任何人都可以得到它。告訴Git叉子忘記跟蹤之前跟蹤的文件,但仍然保持在上游

現在這個文件是穩定的,在開發過程中不再需要觸摸它,但它仍應允許在每個叉上進行自定義更改。這些自定義更改應該只在叉中是本地的,不應該再污染上游。

這些被試:

  1. 的條目已經被添加到的.gitignore,但由於該文件之前跟蹤,這不會幫助。

  2. 嘗試git update-index --assume-unchanged file.xml,這對我的環境很好,但它並不會自動更新所有這些叉子。

  3. 嘗試git rm --cached file.xml,這是不好的,因爲這會從上游移除文件。雖然本地副本不會被刪除,但是從現在開始分叉的任何新人都不會獲得此文件。

我很想在git中看到一些自動方式來實現這一點。否則,我將不得不和2一起去,並且要求每一個誰分叉誰來執行這個命令,這是真正的痛苦。

+1

你需要決定你想要這個文件。它是本地的嗎?它是否發佈在遠程?我懷疑這個文件從不應該首先提交,但是如果沒有更多的信息,我不會回答。 –

+0

還有什麼遺漏?我已經說過這個問題,在開發過程中需要它,現在它是穩定的,但仍需要在項目中保留自定義的本地更改。 – user1589188

回答

1

我不控制託管

在這種情況下,gitlab,將集中政策更難(它可以與網絡掛接雖然完成)

這裏是另外一個建議:

  • file.xml重命名爲file.xml.do-not-modify
  • add a content filter driver(污跡腳本),這將在結帳產生自動file.xml(通過複製file.xml.do-not-modify

smudge

file.xml將是私有的(可addet到你的.gitignore),並且可以在當地修改。

內容過濾器驅動程序仍然需要由每個用戶在本地激活,但是如果他們需要file.xml,他們將不得不(如您的項目的自述文件中所述)。

+0

再次感謝。當你在結帳時說生成文件,這是每個結帳?會覆蓋本地副本嗎? – user1589188

+0

@ user1589188它在每次結帳時會執行的操作是執行您在'.gitattributes'中與'file.xml.do-not-modify'相關聯的污跡腳本:添加該腳本所需的所有智能,例如,如果不存在,則覆蓋生成的文件。 http://stackoverflow.com/a/638980/6309 – VonC

1

2已經足夠好了,但是您仍然需要一種強制執行該文件的方式,以免被修改。
由於Git的分佈式特性,這意味着有一個預接收鉤子,它將檢測該特定文件是否被推送,並將拒絕推送。

git diff --name-only $OLD..$NEW 

請參閱 「git pre-receive (push) hook detect if a merge was done in a specific file」(合併部分不在這裏releavant)
參見 「Git pre-receive hook」 列出所有文件在所有oldrefnewref接收。

+0

謝謝。我還沒有研究過這個細節,但根據你的描述,這意味着每次嘗試推送這個文件的分支都會被拒絕?這如何幫助fork知道應該運行假定不變的命令以避免被拒絕? – user1589188

+0

@ user1589188上游回購並不知道「假定 - 不變」狀態(這純粹是下游回購的本地情況)。所有它知道的是,如果它看到推送的特定文件,那意味着某人正試圖發佈對該文件所做的修改,並且可以防止這種修改。這是您的新策略「不對該文件進行任何新修改」的集中實施。 – VonC

+0

@ user1589188你的解決方案2可以幫助一些用戶(他們會花時間來配置他們的回購),以記住他們*應該*不會添加和提交對該文件的本地修改,但是我建議的將幫助*所有*用戶意識到他們*必須*不提交(並推送)對該文件的任何修改。 – VonC