4

早些时候有人问过我这个问题,#git但由于它相当重要,我会在这里发布。我想filter-branch在 repo 上运行 a 以使用 python 脚本在数百次提交中修改(数千个)文件。我clean.py在 repo 目录中使用以下命令调用脚本:

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 上运行过滤器分支。
编辑该脚本在 Centros 上的工作方式与git1.7.1

files/*/*/**目标是在内容完成与数据库同步后减小 CDN 存储库的大小(接近 1GB) 。用于重写的项目目标 repo
的源代码

4

3 回答 3

2

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

阅读您的 python 代码,您似乎正在尝试删除超过一定大小的每个文件,而不是 .INI 文件,我说对了吗?

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

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

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

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

我在jsdelivr repo 上快速运行了这个,并在清理的 repo中将包大小从 284M 减少到 138M 。BFG 清洁步骤用时不到 5 秒,随后git gc --prune=now --aggressive用时不到 2 分钟。

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

于 2014-03-30T07:07:53.960 回答
1

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

于 2014-03-30T07:21:47.053 回答
0

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

于 2014-04-02T21:28:08.177 回答