簡體   English   中英

如何配置git來覆蓋非文本文件而不是版本控制呢?

[英]how to config git to overwrite non text file instead of version controlled it?

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

提前致謝!

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>"

在我們的例子中,添加'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM