2012-11-17 28 views
4

原標題:如何使git忽略我的文件而不管分支?如何將更新的git-hash嵌入到Version.hpp中?

我有以下幾點結賬後的文件會預期其工作原理:

#!/usr/bin/ruby 

cmd = ENV["HOME"] + "/dev/pitbull/cpp/bin/gen_version.rb --write" 
`#{cmd}` 

的gen_version.rb腳本計算出一個時間戳,上次主標籤,頭git的哈希,並寫入到VERSION.hpp該文件也在git中。我使用use git update-index --assume-unchanged VERSION.hpp讓git忽略我的改變。

現在,如果我留在我的開發分支上,這個工作很好。但是,當我嘗試get checkout master,我擰:

git checkout master 
error: Your local changes to the following files would be overwritten by checkout: 
    cpp/inc/core/util/VERSION.hpp 
Please, commit your changes or stash them before you can switch branches. 
Aborting 

什麼是正確的git的設置,使我可以更新VERSION.hpp當我檢查了,但讓Git忽略這個文件進行任何更改,無論我的分支?

EDIT 我改變主題作爲最終溶液實際地址可以是到的SO更多的用戶更有用更廣的主題。因此,您可以通過兩種方式閱讀此主題:使用原始標題和下面的答案,或者使用上面的更廣泛的問題,以及下面的整個解決方案。

+0

如果我明白你的意思,你可以在結賬時覆蓋對這個文件所做的更改。嘗試git checkout -f – Lesstat

+0

@Lesstat聽起來很合理,但是當我嘗試它時,我得到了:錯誤:條目'cpp/inc/core/util/VERSION.hpp'不是uptodate。無法合併。 – kfmfe04

+1

姆姆你有沒有考慮忽略與.gitignore文件一起的文件? – Lesstat

回答

3

爲了解決我原來的問題:如何讓git忽略我的文件而不管分支?

  1. 的git RM CPP/INC /核心/ UTIL/VERSION.hpp
  2. 添加CPP/INC /核心/ UTIL/VERSION.hpp到的.gitignore

爲解決:如何將更新的git-hash嵌入到Version.hpp中?

問題的一部分是一個雞蛋問題,在所有文件都被檢入之前,你無法知道你的散列,但是直到你知道你的git-hash之後,你才能檢查你更新的VERSION.hpp。所以我的解決方案是將VERSION.hpp放在存儲庫和.gitignore文件中。

請記住將VERSION.hpp嵌入到可執行文件中的目的:如果在生產中出現一個討厭的bug,在二進制文件中使用git-hash,我們將知道要檢查git的代碼,可以正確調試代碼。

下面是我除了上面兩個步驟步驟:

  1. 寫一個簡短的Ruby腳本,做兩件事情,這取決於當地是否是髒的(如果git diff --shortstat顯示更多比0行,你有一個骯髒的地區)。 git rev-list HEAD | sed -n '1p' | cut -c1-10會爲您提供前10個字符作爲git-hash。如果你的本地區域很髒,這是最後一頭的git-hash(我在VERSION.hpp中嵌入了字符串LAST)。如果這是乾淨的,那麼這是你真正的當前git-hash。
  2. ruby​​腳本將檢查結果1.與實際的VERSION.hpp文件。如果結果已更改,則將新結果寫入VERSION.hpp。
  3. 修改我的.bashrc,增加了兩個小的別名 - cmakerelcmakedbg​​調用在我的本地cmake併發布目錄,但我做之前,我CMake的,並在該別名,我呼籲在1紅寶石腳本。在必要時更新我的​​VERSION.hpp。

如果我打電話cmakerel和cmakedbg​​ git的結帳後,如果我不生成(我不應該做的,反正實際釋放)之前修改代碼,我將有VERSION.hpp我需要嵌入所有適當的信息。

的替代解決方案與所述別名修改.bashrc中是使用git的結帳後鉤(理論上)。然而,我無法讓這工作,我已經花了太多時間在這個問題上,但你可能會有更好的運氣。

相關問題