考虑这个简单的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)
请注意,通过使用历史列表,您可以在曾经存在的任何状态下重建当前字典.我认为这是一个"前向构建"(缺少一个更好的术语)因为要构建当前字典,必须从头开始并处理整个历史列表.我认为这是最明显和最直接的方法.
正如我所听到的,早期版本控制系统使用了这种"前向构建"过程,但它们并不是最佳的,因为大多数用户更关心构建的最新版本.此外,当用户只关心查看最新版本时,他们不想下载整个历史记录.
那么我的问题是,在版本控制系统中存储历史记录还有哪些其他方法?也许可以使用"向后构建"?这可能允许用户仅下载最近的修订版而不需要整个历史记录.我还看到了一些用于存储历史记录的不同格式,即:变更集,快照和补丁.变更集,快照和补丁之间有什么区别? …
我的git设置有一个我推送的中央存储库.今天我决定查看中央存储库使用Git Extensions,它说repo没有提交(几乎就像回购从未创建过).调查这个问题,我试图克隆回购,它给了我一些我从未见过的奇怪错误:
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
error: non-monotonic …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JGit克隆Git存储库,我遇到了UnsupportedCredentialItem的问题.
我的代码:
FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repository = builder.setGitDir(PATH).readEnvironment().findGitDir().build();
Git git = new Git(repository);
CloneCommand clone = git.cloneRepository();
clone.setBare(false);
clone.setCloneAllBranches(true);
clone.setDirectory(PATH).setURI(url);
UsernamePasswordCredentialsProvider user = new UsernamePasswordCredentialsProvider(login, password);
clone.setCredentialsProvider(user);
clone.call();
Run Code Online (Sandbox Code Playgroud)
它会发生异常:
org.eclipse.jgit.errors.UnsupportedCredentialItem: ssh://git@github.com:22: Passphrase for C:\Users\Marek\.ssh\id_rsa at
org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider.get(UsernamePasswordCredentialsProvider.java:110)....
Run Code Online (Sandbox Code Playgroud)
但是,如果我在.ssh \中删除文件known_hosts,它将发生不同的异常
org.eclipse.jgit.errors.UnsupportedCredentialItem: ssh://git@github.com:22: The authenticity of host 'github.com' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting?
at org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider.get(UsernamePasswordCredentialsProvider.java:110)....
Run Code Online (Sandbox Code Playgroud)
是否有可能对该问题键入"是"或者只是跳过它?
谢谢!
我的本地存储库有大约500个文件,总大小约为125MB.我在" http://repositoryhosting.com/ " 提供的存储上初始化了一个git存储库.
我通过Git GUI执行了以下步骤
它说,它上传到远程回购,我可以看到文件,但回购现在的大小只有26 MB.
我尝试在远程仓库的另一台机器上的两个不同场合git clone和git pull.他们似乎完全下载了Remote repo上的26MB.但是当我检查机器上文件夹的大小时,它显示它是125MB.
问题:
我的问题比标题中声明的更为笼统.
我知道源版本控制仅存储有关差异的信息.据我所知,维基百科也是如此,github也是如此.
但他们都有能力显示具有特定修订版的整个文件.他们是否会逐步将其从第一次修订恢复到特定版本?
还有一个问题.如果他们只存储差异,他们如何用上下文显示它们(更改前后的一点点文本).
编辑: github存储整个快照而不是增量
当我执行时git push,它显示以下输出
Counting objects: 214, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (213/213), done.
Writing objects: 26% (57/214), 27.44 MiB | 60.00 KiB/s
Run Code Online (Sandbox Code Playgroud)
由此可见,Git 使用了 delta 压缩方法。增量压缩如何工作?它也可以用于其他应用程序吗?如果是,请推荐此类应用程序。
我们正在处理一个需要迁移到Git的大型项目.不幸的是,它包含大量的二进制文件,其中一些是zip-s,dll-s等等.目前,无法从版本控制系统中删除这些二进制文件.
我想了解更多关于Git如何保持二进制文件的增量以及是否以及它不存在的增量.我知道这可以通过.gitattributes文件进行配置,但是文件类型是否需要明确列出,或者是否有一个预先定义的默认设置,它可以识别并自动处理......?
我想在回购历史记录中的某个时刻访问一些 blob。
目前,我使用git show $REV:$PATH. 但文件非常大,我不希望在脚本中读取和传送它们。我想获取他们的路径,然后将其作为普通文件读取。
我可以依赖当前文档中描述的布局(例如.git/objects/ee/2403ffd236587a2b17ddc35b0e711fc99ba6a0),获取文件哈希并将其手动转换为路径吗?我的意思是它在未来的版本中不会很快改变,并且对象目录始终具有这种结构。有没有更简单的方法可以通过一些管道命令来做到这一点?
我在git repo中有一个“大”(5 mb)文本文件。如果我在最后一行添加一个字符并运行,git add我的.git文件夹的大小将增加约1 mb(我假设这是5 mb文件的压缩大小)。
每当我进行编辑和添加时,都会发生相同的情况。
如果我运行,git add -p file我会得到一个很好的差异,只有几个字节。但是无论如何,当我完全填充添加内容时,大对象文件就被存储了。
运行git gc --prune=now会删除较大的目标文件,并且一切似乎仍然可以正常进行。
但是在每次添加之后定期运行git gc并不是一个好选择,因为我在SD卡上以自动方式使用git,这样会使卡的写和删除兆字节用完。
所以,我的问题是
1)我是对的,这是git的行为吗?还是我误会了什么?
2)我可以避免这种情况,让git只保存差异吗?
我毫不犹豫地恢复了旧变更等方面的灵活性。无需分支或存储或其他会使git的生命复杂化的事情。
编辑 为了清楚起见,我的问题不是git保存整个文件一次。但是它存储了每次编辑的整个文件。如果我在每次字符编辑之间添加了10个字符并进行了添加和提交,则它将整个文件(以压缩形式)保存10次。
这个帖子暗示放置
*.jpg binary -delta
Run Code Online (Sandbox Code Playgroud)
在.gitattributegit 中的repos文件,但我不确定它是做什么的.我找不到git的'-delta'标志的任何例子.
目的是显然加快更大文件的提交或推送时间.
我有兴趣了解Git源代码,也许有一天会对它做出贡献.
我理解Git源代码是基于:
2)HTTP,HTTPS,SSH等技术
我只是想知道,还有什么是理解Git源代码的先决条件吗?
git ×9
github ×3
algorithm ×1
clone ×1
compression ×1
diff ×1
git-commit ×1
git-diff ×1
git-lfs ×1
git-plumbing ×1
git-push ×1
gitlab ×1
jgit ×1
mercurial ×1
python ×1
repository ×1
svn ×1