如果我有一個既有源代碼也有其他類型的文件的git倉庫,比如幻燈片,二進制文件等。我想讓git只是版本控制文本文件(比如源代碼)。對於其他文件類型(例如二進制文件),我只想將一個副本存儲在git存儲庫中,即我希望git在更新文件時覆蓋該文件。我不想爲其他類型的文件存儲多個版本,因爲它們可能非常大。有沒有辦法爲此目的配置git?我運行我自己的git主機。如何配置git覆蓋非文本文件而不是版本控制它?
在此先感謝!
如果我有一個既有源代碼也有其他類型的文件的git倉庫,比如幻燈片,二進制文件等。我想讓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>"
在我們的案例中,添加了「香蕉」的提交的原始消息。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
鉤會做對你的工作有一些技巧
混帳,是一個基於快照VCS,與整個歷史上的加密安全散列,是不是能「忘記」老版本並將其替換爲文件的「新」版本。這會破壞它的加密安全。
Git被設計爲最佳的源代碼,並不是最佳的二進制文件,但其他VCS系統也不是最佳的。
一個解決方案是忽略git倉庫的二進制文件,但爲git commit
創建一個別名,它將檢測二進制文件更改並替換單獨存檔中的一個副本(假設它很重要)。
請記住,如果你的二進制文件不經常改變,那麼git首先是有效的,不存儲重複,然後壓縮這些文件。您還可以將這些文件標記爲--assume-unchanged
(我沒有使用它,因此請檢查手冊),以便忽略短期更改。
是的,但混帳是能夠_rewrite它的history_,這就是我濫用:) – c00kiemon5ter
@ c00kiemon5ter,我認爲我們同時發佈了一種不同的方法。我是以避免重複的歷史重寫爲基礎的。至少OP有選擇;-) –
'+ 1'讓我發現'--autosquash'。 –
是的,有用:)但你必須指定相同的提交信息(!) – c00kiemon5ter
我喜歡使用git鉤子的想法。是否可以根據存儲庫接收的文件的擴展名來執行此操作? – qkhhly