Git восстановить дату создания файла после клонирования на windows - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть свой удаленный репозиторий на win server 2003, и после проекта cloninig из etalon все даты создания файлов стали датами клонирования.Это нормально, но мне нужно восстановить даты создания файлов как даты первой фиксации файла.Как я знаю, есть несколько способов использовать сценарии post- *, такие как post-receive.Основная идея:

  1. получение файлов с помощью git clone / pull

  2. скрипт пост-получения изменяет атрибуты файла (создаются / обновляются) в соответствии с первымдата принятия файла для созданного файла и дата последнего изменения файла для обновленного.

Есть идеи, как его записать (может быть по-другому)?

Ответы [ 2 ]

3 голосов
/ 08 ноября 2012

Поскольку вы находитесь в Windows, этот скрипт на python может помочь: для каждого файла применяется временная метка самого последнего коммита, в котором файл был изменен:

Ниже приведена действительно голая версия скрипта. Для реального использования я настоятельно рекомендую одну из более надежных версий выше:

#!/usr/bin/env python
# Bare-bones version. Current dir must be top-level of work tree.
# Usage: git-restore-mtime-bare [pathspecs...]
# By default update all files
# Example: to only update only the README and files in ./doc:
# git-restore-mtime-bare README doc

import subprocess, shlex
import sys, os.path

filelist = set()
for path in (sys.argv[1:] or [os.path.curdir]):
    if os.path.isfile(path) or os.path.islink(path):
        filelist.add(os.path.relpath(path))
    elif os.path.isdir(path):
        for root, subdirs, files in os.walk(path):
            if '.git' in subdirs:
                subdirs.remove('.git')
            for file in files:
                filelist.add(os.path.relpath(os.path.join(root, file)))

mtime = 0
gitobj = subprocess.Popen(shlex.split('git whatchanged --pretty=%at'),
                          stdout=subprocess.PIPE)
for line in gitobj.stdout:
    line = line.strip()
    if not line: continue

    if line.startswith(':'):
        file = line.split('\t')[-1]
        if file in filelist:
            filelist.remove(file)
            #print mtime, file
            os.utime(file, (mtime, mtime))
    else:
        mtime = long(line)

    # All files done?
    if not filelist:
        break
0 голосов
/ 30 апреля 2014

Line:

file = line.split ('\ t') [- 1]

следует изменить:

file = os.path.normpath (line.split ('\ t') [- 1])

Потому что, если вы клонируете репозиторий из linux в windows, это будут разные разделители пути и условие if file in filelist не будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...