2012-10-18 83 views
3

如果我有一個既有源代碼也有其他類型的文件的git倉庫,比如幻燈片,二進制文件等。我想讓git只是版本控制文本文件(比如源代碼)。對於其他文件類型(例如二進制文件),我只想將一個副本存儲在git存儲庫中,即我希望git在更新文件時覆蓋該文件。我不想爲其他類型的文件存儲多個版本,因爲它們可能非常大。有沒有辦法爲此目的配置git?我運行我自己的git主機。如何配置git覆蓋非文本文件而不是版本控制它?

在此先感謝!

回答

3

addcommit您想存儲在回購中的所有文件一次在單獨的提交中。
第一次提交應該是你想跟蹤的文件(即文本文件)。

每次您更改一個您想跟蹤的文件時,都會像通常那樣進行新的提交。
每次更改想要存儲一次的文件時,都會提交一個新的提交,並提交添加二進制文件的提交文件rebase/fixup


這裏是在實踐的想法:

$ ls 
banana.pdf bar.bin foo.txt mew.ppt 

$ git status -s 
?? banana.pdf 
?? bar.bin 
?? foo.txt 
?? mew.ppt 

添加文件 - 首先將文件保存,那麼所有的二進制文件的軌道

$ git add foo.txt 
$ git commit -m "foo text file" 

$ git tag "root" HEAD # easy access to the first commit 

$ git add banana.pdf bar.bin mew.ppt 
$ git commit -m "binaries" 

進行修改並提交

$ echo "ohai, I'm a change :D" >> foo.txt 
$ git add foo.txt 
$ git commit -m "foo changed" 

$ echo "ohai, I'm a banana" | hexdump >> banana.pdf 
$ git add banana.pdf 
$ git commit -m "fixup! binaries" 

讓我們看看我們有什麼

$ git log --oneline 
42c09bd fixup! binaries  # this will be merge with 
a9b1853 foo changed 
8899046 binaries   # this - same commit message! 
7c8ae05 foo text file  # this is also the 'root' tag 
現在

重訂的提交到修正內容將提交的二進制文件

$ git rebase --autosquash -i root # everything will be ready for us 
pick 8899046 binaries 
fixup 42c09bd fixup! binaries  # notice this :) 
pick a9b1853 foo changed 
:wq         # vim save and quit 

$ git log --oneline     # lets look at what we end up with 
41e1f09 foo changed 
50adb90 binaries 
7c8ae05 foo text file 

非常重要標記爲新提交的「非跟蹤」文件

git commit -m "fixup! <same message as the commit to merge with>" 

在我們的案例中,添加了「香蕉」的提交的原始消息。PDF」是binaries
所以提交信息的提交,改變任何一個二進制文件應該是fixup! binaries(因爲它是在本例中)


,如果你不命名犯這樣那麼--autosquash不禁你必須手動移動想要合併的提交下的提交行,並用'fixup'替換'pick'(例如,從我們離開的位置繼續):

$ echo "ohai, more changes" >> bar.bin 
$ git add bar.bin 
$ git commit -m "changed bar" 
$ git log --oneline 
bd36eb9 changed bar 
41e1f09 foo changed 
50adb90 binaries 
7c8ae05 foo text file 

$ git rebase -i root 
pick 50adb90 binaries  # you want this to merge with 
pick 41e1f09 foo changed 
pick bd36eb9 changed bar # this 

因此將其更改爲

pick 50adb90 binaries 
fixup bd36eb9 changed bar # under the line to be merged with and with 'fixup' instead of 'pick' 
pick 41e1f09 foo changed 
:wq      # save and quit 

$ git log --oneline  # what we end up with 
9f94cbe foo changed 
886eebd binaries 
7c8ae05 foo text file 

做:)


如果你想走得更遠,你可以用git的鉤自動執行此。看到

$ git help githooks 

一個pre-commit鉤會做對你的工作有一些技巧

+0

'+ 1'讓我發現'--autosquash'。 –

+0

是的,有用:)但你必須指定相同的提交信息(!) – c00kiemon5ter

+0

我喜歡使用git鉤子的想法。是否可以根據存儲庫接收的文件的擴展名來執行此操作? – qkhhly

1

混帳,是一個基於快照VCS,與整個歷史上的加密安全散列,是不是能「忘記」老版本並將其替換爲文件的「新」版本。這會破壞它的加密安全。

Git被設計爲最佳的源代碼,並不是最佳的二進制文件,但其他VCS系統也不是最佳的。

一個解決方案是忽略git倉庫的二進制文件,但爲git commit創建一個別名,它將檢測二進制文件更改並替換單獨存檔中的一個副本(假設它很重要)。

請記住,如果你的二進制文件不經常改變,那麼git首先是有效的,不存儲重複,然後壓縮這些文件。您還可以將這些文件標記爲--assume-unchanged(我沒有使用它,因此請檢查手冊),以便忽略短期更改。

+0

是的,但混帳是能夠_rewrite它的history_,這就是我濫用:) – c00kiemon5ter

+0

@ c00kiemon5ter,我認爲我們同時發佈了一種不同的方法。我是以避免重複的歷史重寫爲基礎的。至少OP有選擇;-) –

相關問題