2016-06-10 103 views
4

我有一些特定於平臺的修改來檢入文件。當我從遠程分支合併時,如何強制git保留本地版本並忽略遠程版本?基本上,就像git-ignore一樣,但對於已經由存儲庫跟蹤的文件。如何防止簽入的文件覆蓋本地版本?

用例是我推送到一個分支,然後將這個分支在不同的平臺上進行測試。首次在每個平臺上進行測試需要運行./configure腳本,該腳本使用平臺特定的自定義修改了某些文件。由於這些更改是自動生成的,因此我不想將它們提交到歷史記錄中。通常我會將這些文件添加到.gitignore,但是,其中一些文件是原始存儲庫的一部分,因此忽略git忽略。

+0

會把它們放在你的git排除文件('.git/info/exclude')中爲你的用例工作嗎? –

+0

是否阻止簽入的文件覆蓋本地版本? –

+0

只有當你修改了/生成的文件時纔會這樣做。如果你想跟蹤它們,'skip-worktree'標誌可能會有所幫助。查看此答案及其鏈接的參考資料。 http://stackoverflow.com/a/13631525/149428 –

回答

4

這可能是git pull keeping local changes的重複,因爲如果特定於平臺的更改不會被提交,那麼第一個答案似乎是最好的解決方案。

+0

感謝您的指針,這是一個很好的解決方案 –

+0

順便說一句,如果你碰巧在Mac,這個('git stash && git pull && git stash pop')是Tower在你拉動時對你的上演和未上演的變化所做的。 –

+0

@tedmiston你怎麼知道塔是做什麼的?我試圖找出如何看到塔命令日誌沒有運氣 –

0

這裏有一個可能的解決方案。

假設原來的HEAD之前git merge是A合併後,運行git checkout A -- path_of_the_file_you_want_to_keep,其恢復文件A.

的地位,但這個使工作樹不潔。如果您運行git status,則會在索引中找到更改的文件。我認爲這是不可避免的,除非你再次提交。

由於原始HEAD由git中的變量ORIG_HEAD引用,因此無論A的實際sha1如何,始終可以運行git checkout ORIG_HEAD -- path_of_the_file_you_want_to_keep

+0

我是否需要提交在執行./configure之前發生的所有平臺特定修改,然後才能檢出這些文件? –

+0

我不清楚你的需求,但我認爲這取決於。您可以提交任何要保留和恢復的更改。 – ElpieKay

0

不檢查它們。使用不同的名稱檢入模板,並忽略活動文件的名稱。

如果您的項目需要一個名爲(例如)config.txt的文件,請將該文件名放在.gitignore中,並將名稱不同的文件(如config.sample.txt)檢入存儲庫。如果你想變得有趣,你可以讓你的應用程序自動將文件從config.sample.txt複製到config.txt,如果該文件還不存在。

+0

我正在分叉現有的項目,並且這些文件已經簽入。它們正在通過./configure腳本進行修改,因此大概需要在那裏有 –

+0

因此'git mv'文件從它的當前名稱到新的名稱,並修改'configure'腳本來複制文件,就像我在我的答案中所解釋的那樣。 – duskwuff

+0

這是[配置腳本](https://github.com/tensorflow/tensorflow/blob/14ac2235699509f512b44b71160239c153ab413d/configure)btw –