繁体   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