相关疑难解决方法(0)

git如何存储文件?

我刚开始学习git并且这样做我开始阅读Git社区书,在本书中他们说SVN和CVS存储文件之间的差异,而git存储所有文件的快照.

但我并没有真正了解快照的含义.git是否真的复制了每个提交中的所有文件,因为这是我从他们的解释中理解的.

PS:如果有任何人有更好的学习git的来源我会很感激.

git

204
推荐指数
3
解决办法
7万
查看次数

Git中的文件限制是多少(数量和大小)?

有谁知道文件数量和文件大小的Git限制是什么?

git

170
推荐指数
5
解决办法
11万
查看次数

当git说它正在"解决三角洲"时,它实际上在做什么?

在第一次克隆存储库时,git首先接收对象(这很明显),然后花费大约相同的时间"解析增量".在克隆的这个阶段实际发生了什么?

git

168
推荐指数
2
解决办法
4万
查看次数

git索引包含什么?

Git索引究竟包含什么,以及我可以使用什么命令来查看索引的内容?


更新

谢谢你的所有答案.我知道索引充当临时区域,提交的内容是索引而不是工作树.我只是对索引对象的内容感到好奇.我想它可能是文件名/目录名列表,SHA-1对,也许是一种虚拟树?

在Git术语中,是否有任何可用于列出索引内容的管道命令?

git internal

166
推荐指数
3
解决办法
6万
查看次数

Git的包文件是否是快照而不是快照?

Git与大多数其他版本控制系统之间的主要区别之一是,其他人倾向于将提交存储为一系列增量 - 一次提交与下一次提交之间的更改集.这似乎是合乎逻辑的,因为它是存储提交的最小可能信息量.但是,提交历史记录越长,比较修订范围所需的计算就越多.

相比之下,Git 在每个版本中存储了整个项目完整快照.这并没有使回购规模显着每个提交成长的原因是项目中的每个文件存储在Git的子目录中的文件,名为对其内容的哈希值.因此,如果内容未更改,则散列未更改,并且提交仅指向同一文件.还有其他优化.

所有这些对我来说都是有意义的,直到我偶然发现有关包文件的信息,Git定期将数据放入其中以节省空间:

为了节省空间,Git使用了packfile.这是一种格式,其中的Git只会保存在第二个文件已经改变,它的指针是类似文件的一部分.

这基本上不会回到存储增量吗?如果没有,它有什么不同?这如何避免Git遇到其他版本控制系统遇到的相同问题?

例如,Subversion使用增量,回滚50个版本意味着撤消50个差异,而使用Git,您可以获取适当的快照.除非git还在packfiles中存储50个差异...是否有一些机制说"在经过一些少量的增量后,我们将存储一个全新的快照",这样我们就不会堆积太大的变更集?Git还有什么可以避免增量的缺点?

git version-control internals

65
推荐指数
2
解决办法
1万
查看次数

在git repo中查找超过x兆字节的文件,这些文件在HEAD中不存在

我有一个Git存储库我存储随机的东西.大多是随机脚本,文本文件,我设计的网站等等.

我随着时间的推移删除了一些大型二进制文件(通常为1-5MB),它们会增加存储库的大小,这在修订历史中是不需要的.

基本上我希望能够做到..

me@host:~$ [magic command or script]
aad29819a908cc1c05c3b1102862746ba29bafc0 : example/blah.psd : 3.8MB : 130 days old
6e73ca29c379b71b4ff8c6b6a5df9c7f0f1f5627 : another/big.file : 1.12MB : 214 days old
Run Code Online (Sandbox Code Playgroud)

..然后能够查看每个结果,检查是否不再需要然后删除它(可能使用filter-branch)

git

57
推荐指数
5
解决办法
2万
查看次数

用大文件Git

情况

我有两台服务器,生产和开发.在生产服务器上,有两个应用程序和多个(6)数据库(MySQL),我需要将它们分发给开发人员进行测试.所有源代码都存储在开发服务器上的GitLab中,开发人员只能使用此服务器,并且无权访问生产服务器.当我们发布一个应用程序时,master会登录到生产环境并从Git中提取新版本.数据库很大(每个超过500M并且数不胜数),我需要尽可能简单地将它们分发给开发人员进行测试.

可能的解决方案

  • 在将数据库(每个数据库)转储到单个文件的备份脚本之后,执行将每个数据库推送到其自己的分支的脚本.如果开发人员想要更新他的本地副本,则会拉出其中一个分支.

    发现这个不起作用.

  • 生产服务器上的Cron每天都会保存二进制日志,并将它们推送到该数据库的分支中.因此,在分支中,有每日更改的文件,开发人员会提取他没有的文件.当前的SQL转储将以另一种方式发送给开发人员.当存储库的大小变得太大时,我们将向开发人员发送完全转储并刷新存储库中的所有数据并从头开始.

问题

  • 解决方案可行吗?
  • 如果git正在推送/拉出存储库,它是上传/下载整个文件,还是只更改它们(即添加新行或编辑当前的行)?
  • Git可以管理如此大的文件吗?没有.
  • 如何设置存储库中保留的修订数量?与新解决方案无关.
  • 有没有更好的解决方案?我不想强迫开发人员通过FTP或类似的东西下载这么大的文件.

git large-files gitlab

41
推荐指数
4
解决办法
5万
查看次数

如何在不使用git的情况下查看git对象和索引

使用OS X终端,

如何以纯文本格式查看这些文件的内容?

git macos terminal version-control

16
推荐指数
4
解决办法
7904
查看次数

git何时以及如何使用增量进行存储?

阅读git的文档他们强调的一件事是git存储快照而不是增量.自从我看到Git的课程说Git存储了文件版本之间的差异后,我尝试了以下内容:我在一个空文件夹上初始化了一个git存储库,创建了一个lorem.txt包含一些lorem ipsum文本的文件,该文件暂存并提交.

然后find .git/objects -type f在命令行上使用我列出了在对象文件夹上保存的git,并且按照预期找到了一个提交对象,该对象指向指向包含我保存的lorem ispum文本的blob对象的树对象.

然后我修改了lorem ipsum文本,添加了更多内容,暂存了这个更改并提交了.再次列出文件,我现在可以看到新的提交对象,指向一个新的三个对象和一个新的blob对象.使用git cat-file -p 331cf0780688c73be429fa602f9dd99f18b36793我可以看到新blob的内容.它们正是完整lorem.txt文件的内容,旧内容加上更改.

这符合文档的预期:git存储快照,而不是增量.但是,在互联网上搜索我发现了这个问题.在接受的答案中,我们看到以下内容:

虽然这在概念层面上是真实而重要的,但在存储层面却并非如此.

Git确实使用增量来存储.

不仅如此,它比其他任何系统都更有效率.因为它不保留每个文件的历史记录,所以当它想要进行增量压缩时,需要每个blob,选择一些可能相似的blob(使用包含最接近的先前版本和其他一些版本的试探法),尝试生成增量并选择最小的增量.通过这种方式,它可以(通常取决于启发式方法)利用其他类似文件或比以前更相似的旧版本."pack window"参数允许delta压缩质量的交易性能.默认值(10)通常会得到不错的结果,但是当空间有限或加速网络传输时,git gc --aggressive使用值250,这使得它运行速度非常慢,但为历史数据提供了额外的压缩.

这说Git确实使用增量进行存储.据我所知,Git不会一直使用增量,但只有在检测到它时才有必要.这是真的?

我在文件上放了很多lorem文本,所以它的大小是2mb.我认为当对一个大文本文件做一个小改动时,Git会自动使用增量,但正如我所说的那样.

当Git使用deltas以及它是如何工作的?

git

13
推荐指数
2
解决办法
1779
查看次数

如何存储和计算版本控制历史记录?

考虑这个简单的python代码,它演示了一个非常简单的版本控制设计:

def build_current(history):
    current = {}
    for action, key, value in history:
        assert action in ('set', 'del')
        if action == 'set':
            current[key] = value
        elif action == 'del':
            del current[key]
    return current

history = []
history.append(('set', '1', 'one'))
history.append(('set', '2', 'two'))
history.append(('set', '3', 'three'))
print build_current(history)
history.append(('del', '2', None))
history.append(('set', '1', 'uno'))
history.append(('set', '4', 'four'))
print build_current(history)
for action, key, value in history:
    if key == '2':
        print '(%s, %s, %s)' % (action, key, value)
Run Code Online (Sandbox Code Playgroud)

请注意,通过使用历史列表,您可以在曾经存在的任何状态下重建当前字典.我认为这是一个"前向构建"(缺少一个更好的术语)因为要构建当前字典,必须从头开始并处理整个历史列表.我认为这是最明显和最直接的方法.

正如我所听到的,早期版本控制系统使用了这种"前向构建"过程,但它们并不是最佳的,因为大多数用户更关心构建的最新版本.此外,当用户只关心查看最新版本时,他们不想下载整个历史记录.

那么我的问题是,在版本控制系统中存储历史记录还有哪些其他方法?也许可以使用"向后构建"?这可能允许用户仅下载最近的修订版而不需要整个历史记录.我还看到了一些用于存储历史记录的不同格式,即:变更集,快照和补丁.变更集,快照和补丁之间有什么区别? …

python svn git version-control mercurial

11
推荐指数
3
解决办法
1512
查看次数