繁体   English   中英

Git tree-filter在提交时运行python脚本

[英]Git tree-filter run python script on commits

我之前在#git上被问过这个问题,但由于其合理实质性我会在这里发布。 我想在repo上运行一个filter-branch ,使用python脚本修改(数千个)数百次提交的文件。 我在repo目录中使用以下命令调用clean.py脚本:

git filter-branch -f --tree-filter '(cd ../cleaner/ && python clean.py --path=files/*/*/**)'

Clean.py看起来像这样,将修改路径中的所有文件(即files/*/*/** ):

from os import environ as environment
import argparse, yaml
import logging
from cleaner import Cleaner

parser = argparse.ArgumentParser()
parser.add_argument("--path", help="path to run cleaner on", type=str)
args = parser.parse_args()

# logging.basicConfig(level=logging.DEBUG)

with open("config.yml") as sets:
    config = yaml.load(sets)

path = args.path
if not path:
    path = config["cleaner"]["general_pattern"]

cleaner = Cleaner(config["cleaner"])

print "Cleaning path: " + str(path)
cleaner.clean(path, True)

运行命令后,输出到终端:

$ python deploy.py --verbose
INFO:root:Checked out master branch
INFO:root:Running command:
'git filter-branch -f --tree-filter '(cd C:/Users/Graeme/Documents/programming/clean-cdn/clean-jsdelivr/ && python clean.py --path=files/*/*/**)' -d "../tmp"' in ../jsdelivr
Rewrite 298ec3a2ca5877a25ebd40aeb815d7b5a5f33a7e (1/1535)
Cleaning path: files/*/*/**

C:\Program Files (x86)\git/libexec/git-core\git-filter-branch: line 343: ../commit: No such file or directory
C:\Program Files (x86)\git/libexec/git-core\git-filter-branch: line 346: ../map/298ec3a2ca5877a25ebd40aeb815d7b5a5f33a7e
: No such file or directory
could not write rewritten commit
rm: cannot remove `/c/Users/Graeme/Documents/programming/clean-cdn/tmp/revs': Permission denied
rm: cannot remove directory `/c/Users/Graeme/Documents/programming/clean-cdn/tmp': Directory not empty

python脚本成功执行并正确修改文件,但filter-branch没有完成修复提交。 似乎存在权限问题,但是我无法使用提升的权限来解决它。 我尝试使用git v1.8和v1.9在win7,win8和ubuntu上运行filter-branch。
编辑脚本在Centros上使用git1.7.1

目标是在files/*/*/**完成与数据库同步后减小CDNs repo的大小(接近1GB)。
项目的源代码
目标回购重写

您遇到的权限问题很有趣 - 您是在repo的本地副本(即您可以完全访问文件系统的那个)上,还是在远程服务器上执行此操作?

阅读你的python代码,看起来你正试图删除一个不是.INI文件的特定大小的文件,我做对了吗?

如果是这样的话,我可以问你是否考虑过BFG Repo-Cleaner 显然,你通过编写自己的代码(我知道我有)可以学到很多关于Git的知识,但我认为BFG可能是为你的需求量身定做的 - 而且比任何基于git-filter-branch的方法都要快。

在您的情况下,您可能希望使用以下命令运行它:

$ java -jar bfg.jar --strip-blobs-bigger-than 100K  my-repo.git

这将删除大于100K的所有blob,这些blob 不在您的最新提交中。

我在jsdelivr repo上快速运行了这个,并在清洁的仓库中将包装尺寸从284M缩小到138M。 BFG清洁步骤花了不到5秒钟,随后的git gc --prune=now --aggressive不到2分钟。

完全披露:我是BFG Repo-Cleaner的作者。

您不应该cd到另一个目录,因为git-filter-branch脚本将使用相对路径来访问文件。

考虑使用BFG 它使用起来更快更简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM