[英]how to config git to overwrite non text file instead of version controlled it?
如果我有一個包含源代碼和其他類型文件的git存儲庫,這樣的幻燈片,二進制等等。我希望git只是版本控制文本文件(例如源代碼)。 對於其他文件類型(例如二進制文件),我只想在git存儲庫中存儲一個副本,即每當我更新它時我都希望git覆蓋該文件。 我不想為其他類型的文件存儲多個版本,因為它們可能非常大。 有沒有辦法為此目的配置git? 我運行自己的git主機。
提前致謝!
add
並commit
一旦在一個單獨的承諾要在回購來存儲所有文件。
第一次提交應該是您要跟蹤的文件(即文本文件)。
每次更改要跟蹤的文件時,都會像平常一樣進行新的提交。
每次更改要存儲一次文件時,你犯了一個新的提交和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>"
在我們的例子中,添加'banana.pdf'的提交的原始消息是binaries
所以改變任何二進制文件的提交的提交消息應該是fixup! binaries
fixup! binaries
(在示例中)
如果您沒有以這種方式命名提交,那么--autosquash
無法幫助您,並且您必須在要與其合並的提交下手動移動要更改的提交行,並將'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
鈎子會為你做一些技巧
作為基於快照的VCS,Git在歷史記錄中具有加密安全哈希,無法“忘記”舊版本並將其替換為文件的“新”版本。 這將破壞其加密安全性。
Git被設計為源代碼的最佳選擇,並不是二進制文件的最佳選擇,但其他VCS系統也不是。
一種解決方案是忽略git repo的二進制文件,但為git commit
創建別名,該別名將檢測二進制文件更改並替換單獨存檔中的副本,假設它很重要。
請記住,如果您的二進制文件不經常更改,那么git首先是高效的,不是存儲重復文件,而是第二次壓縮這些文件。 您還可以將文件標記為--assume-unchanged
(我沒有使用它,因此請查看手冊),以便忽略短期更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.