Git хранит время создания файла? - PullRequest
1 голос
/ 27 мая 2020

Допустим, я создал проект и отправил его на GitHub. Когда кто-то клонирует проект, могут ли они увидеть время создания файла каждого файла в проекте?

Ответы [ 3 ]

2 голосов
/ 27 мая 2020

Они могут видеть время, когда файл был добавлен в репозиторий, по дате фиксации.

Они не могут видеть временные метки «создания файла» или «модификации файла» файла в вашей локальной файловой системе.

Пример

$ git init
Initialized empty Git repository in /tmp/tmp.t4KdOYhQGr/.git/
$ echo bla >file.txt
$ git add file.txt
$ git commit -m 'Added a file'
[master (root-commit) 26b458c] Added a file
 1 file changed, 1 insertion(+)
 create mode 100644 file.txt

Давайте посмотрим на объект commit :

$ git cat-file -p 26b458c
tree 80717c30ff0d58d079079d2f4d38441035093c49
author mkrieger1 <me@example.email> 1590570496 +0200
committer mkrieger1 <me@example.email> 1590570496 +0200

Added a file

Он содержит:

  • Ссылка на дерево объект
  • автор с именем, электронной почтой и меткой времени
  • A коммиттер с именем, электронная почта и временная метка

Эти временные метки указывают, когда фиксация была впервые создана и когда она была зафиксирована (может быть другим, например, в случае выбора вишни, но здесь это то же самое).

Давайте посмотрим на объект tree , на который ссылается коммит:

$ git cat-file -p 80717c30ff0d58d079079d2f4d38441035093c49
100644 blob a7f8d9e5dcf3a68fdd2bfb727cde12029875260b    file.txt

Он содержит список из blob объектов (только один в этом case), для каждого:

  • Права доступа к файлам
  • Ссылка на данные BLOB-объектов
  • Имя bl ob в дереве

Он вообще не содержит никаких временных меток. Давайте посмотрим на объект blob , на который ссылается дерево:

$ git cat-file -p a7f8d9e5dcf3a68fdd2bfb727cde12029875260b
bla

Это просто голое содержимое файла, здесь нет временных меток.

Заключение

Единственные временные метки, которые хранятся в репозитории Git, - это даты «автора» и «коммиттера» в объектах commit . Объекты tree и blob не содержат никаких временных меток.

Нет информации о временных метках файлов в локальной файловой системе, содержащейся в репозитории Git.

1 голос
/ 27 мая 2020

В git нет такого понятия, как время создания файла, потому что файлов нет. В репо хранятся капли и информация о них. Когда вы клонируете репо или проверяете ветку, то есть когда некоторые файлы создаются в вашем рабочем дереве, и дата их создания будет в этот момент.

Попробуйте сами. Клонируйте собственное удаленное репо и посмотрите даты создания видимых файлов. Теперь все будут.

1 голос
/ 27 мая 2020

Быстрый тест показывает, что нет, временные метки файла не сохраняются.

$ git init a
Initialized empty Git repository in /home/attie/stackoverflow/62039244/a/.git/
$ cd a
$ touch file
$ git add file
$ git ci -m "test"
[master (root-commit) 6cb306d] test
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file
$ stat file
  File: 'file'
  Size: 0               Blocks: 1          IO Block: 131072 regular empty file
Device: 10000eh/1048590d        Inode: 144982      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   attie)   Gid: ( 1000/   attie)
Access: 2020-05-27 10:01:02.938719777 +0100
Modify: 2020-05-27 10:01:02.938719777 +0100
Change: 2020-05-27 10:01:02.938719777 +0100
 Birth: -
$ cd ..
$ git clone a/.git ./b
Cloning into './b'...
done.
$ cd b
$ stat file
  File: 'file'
  Size: 0               Blocks: 1          IO Block: 131072 regular empty file
Device: 10000eh/1048590d        Inode: 152483      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   attie)   Gid: ( 1000/   attie)
Access: 2020-05-27 10:01:22.494692052 +0100
Modify: 2020-05-27 10:01:22.494692052 +0100
Change: 2020-05-27 10:01:22.494692052 +0100
 Birth: -

Проверив сам коммит, мы видим, что временные метки как авторства, так и фиксации в репозитории сохраняются вместе с типом файла, режимом и содержимым ha sh ... ни одного из базовых полей ctime / atime / mtime / crtime или любого из остальных полей struct stat.

$ git cat-file -p HEAD
tree df2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078
author Attie Grande <attie@perdy.attie.co.uk> 1590570072 +0100
committer Attie Grande <attie@perdy.attie.co.uk> 1590570072 +0100

test
$ git cat-file -p df2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    file

Вам нужно быть очень осторожным, если вы имеете дело с временными метками, связанными с файлом, потому что во многих случаях он не даст вам информацию, которую вы могли бы ожидать.

  1. Если файловая система смонтирована с помощью noatime или аналогичного, то открытие файла не обязательно приведет к обновлению этой отметки времени.
  2. Если вы используете редактор (например: vim), тогда временный файл может быть создан при сохранении, который впоследствии перемещается на место. В этой ситуации все метки времени обновляются, чтобы отразить новый файл, метки времени старого файла не сохраняются.
  3. Некоторые файловые системы фактически не поддерживают хранение создания (« рождение » ) время файла.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...