如果我有一个 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>"
在我们的例子中,添加“banana.pdf”的提交的原始消息是binaries
这样的,更改任何二进制文件的提交的提交消息应该是fixup! binaries
(如示例中所示)
如果您不以这种方式命名提交,则--autosquash
无法为您提供帮助,并且您必须手动将要更改的提交的行移动到要与其合并的提交下,并将“pick”替换为“fixup”,例如(从我们离开的地方继续):
$ 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 hook自动执行此操作。看
$ git help githooks
一个pre-commit
钩子会用一些技巧为你完成工作
Git 作为基于快照的 VCS,在历史上具有加密安全哈希,无法“忘记”旧版本并将其替换为文件的“新”版本。这将破坏其加密安全性。
Git 被设计为最适合源代码,而不适合二进制文件,但其他 VCS 系统也不是。
一种解决方案是忽略 git repo 的二进制文件,但为其创建一个别名,该别名git commit
将检测二进制文件更改并替换单独存档中的副本,假设它很重要。
请记住,如果您的二进制文件不经常更改,那么 git 首先是高效的,不存储重复项,其次是压缩这些文件。您还可以将文件标记为--assume-unchanged
(我没有使用它,所以请查看手册),以便忽略短期更改。