相关疑难解决方法(0)

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

考虑这个简单的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
查看次数

Git错误"非单调索引"

我的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)

git git-extensions

9
推荐指数
2
解决办法
5167
查看次数

JGit克隆存储库

我正在尝试使用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)

是否有可能对该问题键入"是"或者只是跳过它?

谢谢!

clone repository jgit

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

git是否从本地推送到远程压缩数据?

我的本地存储库有大约500个文件,总大小约为125MB.我在" http://repositoryhosting.com/ " 提供的存储上初始化了一个git存储库.

我通过Git GUI执行了以下步骤

  • git commit(我当地的回购)
  • git远程添加
  • git push

它说,它上传到远程回购,我可以看到文件,但回购现在的大小只有26 MB.

我尝试在远程仓库的另一台机器上的两个不同场合git clone和git pull.他们似乎完全下载了Remote repo上的26MB.但是当我检查机器上文件夹的大小时,它显示它是125MB.

问题:

  1. "git push"在上传到Remote Repo时会压缩数据吗?
  2. 我丢失了数据吗?
  3. 如果我想在多台本地计算机上制作Remote Repo的副本,以便多人可以在同一个项目上工作,我可以使用Git Clone或Git Pull吗?

git version-control github

7
推荐指数
1
解决办法
1778
查看次数

修订控制系统如何恢复修订?

我的问题比标题中声明的更为笼统.

我知道源版本控制仅存储有关差异的信息.据我所知,维基百科也是如此,github也是如此.

但他们都有能力显示具有特定修订版的整个文件.他们是否会逐步将其从第一次修订恢复到特定版本?

还有一个问题.如果他们只存储差异,他们如何用上下文显示它们(更改前后的一点点文本).

编辑: github存储整个快照而不是增量

algorithm version-control diff git-diff

6
推荐指数
1
解决办法
1955
查看次数

git delta 压缩及其用途

当我执行时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 压缩方法。增量压缩如何工作?它也可以用于其他应用程序吗?如果是,请推荐此类应用程序。

compression git github gitlab

5
推荐指数
1
解决办法
1948
查看次数

Git保留哪些类型的二进制文件增量?

我们正在处理一个需要迁移到Git的大型项目.不幸的是,它包含大量的二进制文件,其中一些是zip-s,dll-s等等.目前,无法从版本控制系统中删除这些二进制文件.

我想了解更多关于Git如何保持二进制文件的增量以及是否以及它不存在的增量.我知道这可以通过.gitattributes文件进行配置,但是文件类型是否需要明确列出,或者是否有一个预先定义的默认设置,它可以识别并自动处理......?

git git-lfs

5
推荐指数
1
解决办法
1088
查看次数

Git:获取 .git 目录中的 blob 路径

我想在回购历史记录中的某个时刻访问一些 blob。

目前,我使用git show $REV:$PATH. 但文件非常大,我不希望在脚本中读取和传送它们。我想获取他们的路径,然后将其作为普通文件读取。

我可以依赖当前文档中描述的布局(例如.git/objects/ee/2403ffd236587a2b17ddc35b0e711fc99ba6a0),获取文件哈希并将其手动转换为路径吗?我的意思是它在未来的版本中不会很快改变,并且对象目录始终具有这种结构。有没有更简单的方法可以通过一些管道命令来做到这一点?

git git-plumbing

3
推荐指数
1
解决办法
3028
查看次数

Git似乎存储了整个文件而不是diff,如何避免这种情况?

我在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次。

git

3
推荐指数
1
解决办法
717
查看次数

.*.jpg二进制-delta在.gitattributes文件中做了什么?

这个帖子暗示放置

*.jpg binary -delta
Run Code Online (Sandbox Code Playgroud)

.gitattributegit 中的repos文件,但我不确定它是做什么的.我找不到git的'-delta'标志的任何例子.

目的是显然加快更大文件的提交或推送时间.

git github git-push git-commit gitattributes

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

需要技术堆栈才能理解Git源代码

我有兴趣了解Git源代码,也许有一天会对它做出贡献.

我理解Git源代码是基于:

  1. 语言,如C,Shell,Perl,Python,C++,TCL

2)HTTP,HTTPS,SSH等技术

我只是想知道,还有什么是理解Git源代码的先决条件吗?

git

-4
推荐指数
1
解决办法
146
查看次数