在Windows上克隆后,Git恢复文件日期创建

时间:2011-09-27 13:45:37

标签: git

我在win server 2003上有我的远程存储库,在etalon的cloninig项目之后,文件创建的所有日期都成为了克隆的日期。这没关系,但我需要将文件的创建日期恢复为第一个文件提交的日期。 据我所知,有一些方法可以使用post-*脚本,例如post-receive。 主要想法:

  1. 通过git clone / pull

  2. 接收文件
  3. 接收后脚本根据创建的第一个文件提交日期和更新的最后一个文件提交日期修改文件属性(创建/更新)。

  4. 任何想法如何写(可能是另一种方式)?

3 个答案:

答案 0 :(得分:3)

由于你在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

答案 1 :(得分:1)

Python3版本,文件必须在相同的git目录中运行:

#!/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.decode('ascii').strip()
    if not line: continue

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

    # All files done?
    if not filelist:
        break

答案 2 :(得分:0)

行:

  

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

应该改变:

  

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

因为如果你将存储库从linux克隆到windows,它将是不同的路径分隔符,条件if file in filelist将不起作用