標籤:

git能不能做到在代碼庫里添加文件,當你沒有的時候才獲取它,有的時候就忽略它?

比如資料庫配置文件,每個人本地都不同,一般都是ignore掉它的。但是新項目clone下來,沒了這個文件,可能程序根本就沒法跑。偏偏這個文件又不是很簡單就能手寫出來的,裡面可能會有很多格式。放在版本庫里是不可能的,大家本地資料庫配置都不同,不能提交上來導致別人pull的時候把本地配置搞壞。

這種文件只有一兩個還好,只要本地拷貝一下就行了。(其實我也嫌煩,尤其是本地windows往linux伺服器上部署的時候,本來命令行操作操作就好了,非要再搞個ftp。就算用ssh+vim,本地複製的文本往直接往vim里貼,也會導致縮進變形。。。扯遠了)如果這類文件很多的話,真不知道怎麼處理(自己都記不清需要手動同步幾個這樣的文件,一不小心就會漏掉)。

有沒有解決這樣問題的方法?

因為百度搜索不知道怎麼描述,所以就放知乎來問了。


不一定能解決題主的需求,說一下我知道的。

首先配置要儘可能做到分離,例如分為default、development、test、production,不同場景下讀取不同的配置文件,這屬於常規做法,解決本地、伺服器配置不同的問題。不過僅靠這個不能解決「每個開發人員的development配置不同」的問題,也不能解決「不希望把自己本地的資料庫密碼上傳到repo」的問題。

如果repo是你或你的團隊的,第一種最簡單的做法是只留一個類似config.json.example的樣例文件,保留一份的默認配置,但實際不使用此文件做配置文件,在使用應用的時候複製一份重命名為config.json,根據需要做少量修改即可。gitignore里加入config.json,因而正式起作用的config不會被上傳。要做的事情是每次clone下來後,要手動複製+根據情況少量修改。

第二種方法可以適用於repo不是你的情況,參考Keep file in a Git repo, but don"t track changes的高票回答(不是綠鉤的回答,排在第二),使用

git update-index --assume-unchanged FILE_NAME

在本地忽略修改指定的文件,做到git repo里有這個東西,但是這些文件在本地的修改會被忽略,git diff里看不到,git add -A也不會加進來。缺點是update-index似乎是僅在本地作用,每次clone下來都要重新update-index一遍,否則新機器默認clone下來之後依舊會追蹤修改。換句話說,多個人做開發,每個人clone之後都要update-index。

第三種可能的方法是使用 --skip-worktree,別處聽說的,暫且沒有研究,該搬磚了有空再更新...

Bonus:

  • 進入vim後,輸入命令:set paste進入paste模式,這時候按i再粘貼就不會亂縮進,結束粘貼後通過:set nopaste取消paste模式,恢復原先的模式下。
  • Linux互相傳文件可以使用scp,用起來和cp差不多;Windows &<-&> Linux傳輸文件,可以試試sz和rz,需要Linux安裝lrzsz包,基於zmodem協議傳輸速率很低,不適合傳大文件,不過傳KB級別的配置文件方便程度能夠達到scp的水平了。
  • 儘可能試著避免「配置文件特別多」這種情況,我閱歷較少,但似乎也沒看到過一個項目里需要管理多於兩個配置文件的情形。


嘗試回答一下題主的問題,不清楚題主的具體開發環境所以就籠統的說一下。對於本地開發環境的配置和伺服器端部署時環境配置不同的問題,題主可以同步多個不同版本的資料庫配置文件來應對不同的開發環境,並不一定要忽略這些配置文件,你可以有local-dev-general.config, local-dev-linux.config, local-dev-windows.config等等文件全部同步到Github伺服器,在本地跑或者伺服器端部署的時候你只要在命令行里指定對應的文件或者在你的環境變數里配置好就可以了。


這是因為你們的開發流程和規範不行導致的,跟git無關

涉及到配置,必然是默認配置/測試配置/生產配置,除了生產配置可能要求保密,其他都放git庫

默認配置按本機走,資料庫以MySQL為例就是localhost:3306, root/password/test庫

本機啟動通過默認配置直接啟動

其他環境啟動的時候通過環境變數選擇一個環境,覆蓋默認配置

具體到開發語言,要根據語言特性來實現,比較好的實現是SpringCloud,允許讀遠程配置庫


假設 config-dev.yml 是和本機相關的文件,我的遷移方案如下:

a. 新建示例配置文件 config-dev.yml.sample 加入 git 中,並忽略 config-dev.yml 文件:

cp config-dev.yml config-dev.yml.sample
git add config-dev.yml.sample
git rm config-dev.yml
git commit
echo "config-dev.yml" &>&> .gitignore

b. 新成員 git clone 之後,本地新建 config-dev.yml 文件並按需調整:

cp config-dev.yml.sample config-dev.yml
# edit config-dev.yml

寫在腳本里就不會漏掉了 cat setup-dev.py

for filename in ["config-dev.yml", "db-dev.yml"]:
if not file_exists(filename):
copy(filename + ".sample", filename)


同廖老師所講,以springboot項目為例,在複雜的情況下,用spring cloud config作為中心化配置伺服器.簡單的情況下,一般有application.yml,application-dev.yml ,application-test.yml,application-prod.yml等配置文件,分別對應了開發,測試和生產環境下的配置信息,而application.yml則作為切換各種環境的開關.例如

application.active.profile: dev

表達的是啟用dev環境.這樣就可以很輕鬆的切換各種環境了.

2.當然了,也不是所有的項目都是以springboot,spring cloud這樣的.拿個最基礎的,還是以java距離,在maven環境,是可以配置一個運行的環境變數的,然後配置比如mysql-dev mysql-test這樣的配置文件,在maven的pom.xml配置打包時中根據環境排除其它的文件,然後項目引用的配置不區分後面的後綴即可.這種方案基本上所有語言都會提供類似maven,gradle這樣的構建工具,適用性也很廣,不過稍微會複雜點

3.再補充一點,以我使用的idea舉例,在version control裡面,可以把修改的文件分組,一般我會把修改的配置文件放在selfconfig裡面,其餘默認代碼放在Default中,提交的時候只需要提交Default的即可


Git的日常處理流程 - ChuckLu - 博客園

第三個流程稍微簡單一點


我們之前項目也有這個問題,後來使用 Config 包就妥了。

你自己去看官網,絕對能解決問題。


推薦閱讀:

git如何push時不輸入密碼?
GitCafe 被 Coding 收購的原因和意義?
和一群不用Git的同事寫代碼是一種什麼體驗?
git中有的命令參數為什麼使用一個橫杠 - 有的命令卻使用兩個橫杠 -- ?
sourcetree git ssh私鑰問題 如何解決?

TAG:Git |