相关疑难解决方法(0)

使用Git的多个工作目录?

我不确定这是否是Git所支持的东西,但理论上它似乎应该对我有用.

我的工作流程通常涉及我同时在多个分支中编辑文件.换句话说,我经常想在一个分支中打开一些文件,而我在另一个分支中编辑另一个文件的内容.

我的典型解决方案是进行两次检查,但遗憾的是我不能在它们之间共享分支和引用.我想要的是只有两个工作目录由同一个.git文件夹管理.

我知道本地git clone解决方案(默认情况下,硬链接共享对象,以及--shared选项,它使用原始repo设置备用对象存储),但这些解决方案只减少了磁盘空间使用量,特别是在--shared的情况下,似乎充满了危险.

有没有办法使用一个.git文件夹,并有两个工作目录由它支持?或者是Git硬编码只是随时检查一个工作目录?

git

233
推荐指数
3
解决办法
8万
查看次数

使用原始创建/修改时间戳检出旧文件

有没有办法知道或获得原始的创建/修改时间戳?谢谢.

git

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

在Git中恢复文件的修改时间

我理解每次更改文件时更新修改时间默认Git行为,但有时我想恢复文件的原始修改时间.

有没有办法告诉Git这样做?

(例如,在处理大型项目时,我做了一些更改configure.ac,发现autotools在我的系统上不起作用,并希望将其恢复configure.ac到原始内容和修改时间,这样make就不会尝试configure用我破损的autotools 更新.)

git

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

git clone更改文件修改时间

当我使用" git clone ..."命令克隆git存储库时,我本地存储库中的所有克隆文件都具有相同的修改时间,其中包含git clone发出命令的日期和时间.

有没有办法克隆远程git存储库与每个文件的实际修改时间

git clone

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

如何使用RFC3161(可信)时间戳来证明我的Git存储库中的提交时间?

更新

我已经我正在使用的脚本发布到StackExchange Code Review站点.

我原来的问题是,有没有办法可以使用X.509证书和时间戳签署Git提交?.有一段时间我以为我只能用我的X.509证书签署的东西,我的X.509证书由一个受信任的第三方加盖时间戳.不是这种情况.使用X.509证书和可信时间戳进行数字签名是互斥的.我已更新我的问题以反映这一点.

正如VonC所指出的那样,使用X.509证书签署Git提交不会增加任何价值.由于Git内置支持,使用GPG密钥是一个更好的选择.

我已经接受了格雷格的回答,因为它与我要求的最接近,即使我原来的问题有点含糊不清.正如Greg指出的那样,如果你能证明你在某个时间点知道提交哈希,那么这可以保证你知道当时哈希所用的存储库内容,并且不需要在存储库中存储任何额外的数据.时间戳数据可以存储在任何地方.

可以使用openssl(v1.0.0 +)并curl为提交哈希请求RFC3161时间戳.

请求时间戳

你需要有一些信息:

  • URL - RFC3161时间戳服务
  • REV - 你想要一个timstamp的修订版(哈希).必须是完整哈希.
CONTENT_TYPE="Content-Type: application/timestamp-query"
ACCEPT_TYPE="Accept: application/timestamp-reply"

openssl ts -query -cert -digest "$REV" -sha1 \
    | curl -s -H "$CONTENT_TYPE" -H "$ACCEPT_TYPE" --data-binary @- $URL
Run Code Online (Sandbox Code Playgroud)

以上将输出签名的时间戳stdout.如果时间戳服务拒绝请求,它也可能输出错误.

验证时间戳

这与请求时间戳非常相似,但您还需要:

  • CAFILE - 从时间戳服务返回到根CA的证书链

时间戳服务应该使用由受信任的颁发机构颁发的证书签署时间戳.如果没有,你的时间戳没有太大的可信度.如果找不到或创建正确的证书链,请尝试使用cacert.pem发布的curl.就在这里.

以下代码段假定正在传递现有的签名时间戳回复stdin.应该可以将上述请求直接传递给下面的verify命令.如果将请求中的响应存储在变量中,则可能需要对其进行base64编码/解码(man base64).

openssl ts -verify -digest "$REV" -in /dev/stdin -CAfile "$CAFILE"
Run Code Online (Sandbox Code Playgroud)

如果您检查回复,您会注意到请求摘要与使用的Git修订版匹配.您可以使用此命令检查答复的纯文本版本. …

git x509certificate trusted-timestamp rfc3161

18
推荐指数
1
解决办法
3674
查看次数

快速列出大量文件的上次提交日期

我想列出git存储库中大量文件最后提交日期.

为了具体起见,让我们假设我想获取*.txt特定子目录中所有文件的最后提交日期.存储库中总共有数万个文件,相关*.txt文件的数量在数百个.存储库中已有数千个提交.

我尝试了三种不同的方法.


解答1. 这个问题给出了一个答案,基于git log.但是,如果我尝试做这样的事情,那就很慢了:

find . -name '*.txt' |
    xargs -n1 git log --format=format:%ai -n1 --all -- '{}'
Run Code Online (Sandbox Code Playgroud)

在我的测试案例中,花了几分钟 - 对我来说太慢了.


解决方案2.这样的事情快得多,不到一秒钟:

git log --format=format:%ai --name-only .
Run Code Online (Sandbox Code Playgroud)

但是,我必须编写一个后处理输出的脚本.此外,上面的命令打印出许多永远不需要的信息:无关文件和旧提交.


解决方案3.我也试过这样的东西,以摆脱不相关的文件:

git log --format=format:%ai --name-only `find . -name '*.txt'`
Run Code Online (Sandbox Code Playgroud)

然而,事实证明这比解决方案2 .(运行时间有3个不同.)此外,它仍然会打印不再需要的旧提交.


题.我错过了什么吗?有快速方便的方法吗?当我们提交更多数量的提交时,最好是现在还是将来工作的东西?

git

17
推荐指数
1
解决办法
2502
查看次数

git checkout - 如何在切换分支时保持时间戳?

我经常在分支之间来回切换.我有一个脚本,它将结帐的内容推送到"运行"环境,在那里我可以看到代码运行并测试它(它是一个Web应用程序).此推送脚本的核心使用rsync,它使用时间戳来检测应该传输哪些文件.因为git-checkout似乎将文件的时间戳设置为当前时间,所以rsync报告所有文件都被推送,只是因为时间戳将被更新.

如何在分支之间切换时让git-checkout保留时间戳,以便rsync仅报告内容更改?

我不想使用rsync的校验和参数,因为它非常慢.

git rsync

10
推荐指数
2
解决办法
4894
查看次数

如何克隆存储库并保留文件时间戳?

如何在新机器上从服务器获取源代码的副本,但保留文件时间戳?

使用以下过程,所有时间戳都设置为当前日期/时间.

  1. 手动创建存储库的根文件夹
  2. CD进去吧
  3. 执行 hg init
  4. 使用TortiseHg将存储库从服务器克隆到文件夹.

是否有选项或不同的程序来保存时间戳?

在这个具体案例中,使用Kiln with TortoiseHg.

mercurial

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

获取git repo中文件的最后修改数据

我试图找到命令以获取本地git存储库中文件的最后修改日期。

创建了仓库,并完成了一次提交。不得不编辑一个文件并将提交此文件,但想知道存储库中文件的最后修改数据是什么(不是提交日期)。

没有gui onl命令行。

git log ./path/to/filename.php
Run Code Online (Sandbox Code Playgroud)

只给我提交日期

git command-line

7
推荐指数
4
解决办法
3031
查看次数

从Github存储库上次更新文件时获取

我可以使用GitHub v3 API获取文件内容(如果它是文件夹,我可以获取文件列表). 例:

https://api.github.com/repos/[Owner]/[Repository]/contents/[Folder]
Run Code Online (Sandbox Code Playgroud)

但是如何知道文件上次更新的时间?那有API吗?

github github-api

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