【问题标题】:Date modified in file system does not change when switching branches in Git repo在 Git repo 中切换分支时文件系统中修改的日期不会改变
【发布时间】:2014-09-24 23:05:27
【问题描述】:

有人可以帮我理解为什么在使用 Git 切换分支时 Mac OS 文件系统中的修改日期不会改变吗?例如,我在 repo 中有一个名为 test.txt 的文件,它是 Master 和 Test 分支的一部分。

在主分支中,我编辑并提交文件,然后切换到测试分支。由于 Git 操作文件系统,我预计此时修改日期将更改为活动分支中文件版本的修改日期。

【问题讨论】:

  • 您的预期不正确。当您签出一个分支时,Git 会从其存储中检索文件的版本并将其复制到您项目的工作目录中。此时,您的操作系统会将工作目录中文件的时间戳设置为系统的当前日期和时间。
  • 换句话说,git 使用时间戳来检查文件自上次检出后是否已被修改,否则几乎会忽略它们,特别是不存储时间戳每个文件。

标签: macos git version-control


【解决方案1】:

您的预期不正确。 Git 不会在提交时记录文件的时间戳。

此外,如果签出操作需要 Git 检索文件的不同版本并将其复制到项目的工作树中,您的操作系统将更新工作树中文件的时间戳以反映当前显示的日期和时间由您的系统时钟决定。

通过执行以下实验自行检查。

首先设置:

cd ~/Desktop
mkdir git_test
cd git_test
git init

创建一个文件,开始跟踪它并创建第一个提交(在master)。

touch README.md
git add README.md
git commit -m "add README to project"

现在检查README.md文件的时间戳

ls -la

写下那个时间;就我而言,时间是 19:00;让我们称之为“time1”。在这个阶段,等待至少 60 秒。然后创建并签出一个名为 other 的新分支:

git checkout -b other

编辑README.md;例如:

printf "This is the project's README\n" > README.md

现在暂存文件并创建第二个提交(在other):

git add README.md
git commit -m "edit README"

再做ls -la,记下README.md的时间戳;就我而言,时间是 19:02;我们称之为“time2”。

在这个阶段,提交图(尝试git log --graph --all --decorate)应该如下所示:

* other, HEAD
|
* master

现在再次查看master 并检查工作目录中自述文件的时间戳。

git checkout master
ls -la

现在,与您的预期相反,README.md 的时间戳与 time1 匹配,而是与当前时钟时间匹配。至少再等待 60 秒,然后再次签出 other 并检查时间戳:

git checkout other
ls -la

同样在这种情况下,与您的预期相反,README.md 的时间戳与 time2 匹配,而是与当前时钟时间匹配。


编辑:这是一个较短的实验,证明 Git 不会将文件的时间戳烘焙到相应 blob 的 SHA-1 哈希中。

printf "hello\n" > greetings.txt
git hash-object greetings.txt

写下返回的哈希值。稍等。

touch greetings.txt
git hash-object greetings.txt

即使touch greetings.txt 更改了文件系统中greetings.txt 的时间戳,哈希值也应该与您第一次调用git hash-object 时相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多