4

我之前被問及#git的這個問題,但由於其合理實質性,我將在此處發佈它。我想在回購庫上運行filter-branch,以使用python腳本通過數百次提交修改(數千個)文件。我在回購目錄使用以下命令調用clean.py腳本:Git tree-filter在提交時運行python腳本

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/*/*/**完成了數據庫同步的內容後減少的CDN回購(接近1GB)的大小。
The source code of the project
Target repo for the rewrite

+0

'git --version'的輸出是什麼? – michas

+0

你能澄清你想要清潔的是什麼回購?它是https://github.com/jsdelivr/jsdelivr(當前包大小〜284MB)? –

+0

@michas我試着在'v1.9.0','v1.8.5'和'1.8.3'上運行。是的,這是正確的回購羅伯託 – megawac

回答

2

您遇到的權限問題很有意思,你在回購的本地副本,這樣做(即一個您擁有完全訪問文件系統),或在遠程服務器上?

閱讀你的Python代碼,它看起來像你試圖刪除每個文件超過一個不是.INI文件的特定大小,我得到的是嗎?

如果是這樣的話,我可以問你是否考慮過The BFG Repo-Cleaner?顯然,通過編寫你自己的代碼(我知道我有過),你學到了很多有關Git的知識,但我認爲BFG可能是爲你的需求量身定製的,並且比任何基於方法的任何方法都快。

在你的情況,你可能想用一個命令來運行它像:

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

這消除了比100K大所有的斑點,這不在您的最新提交

我在jsdelivr回購庫上做了一個快速運行,並在the cleaned repo中將包裝尺寸從284M減少到了138M。 BFG清洗步驟需要5秒鐘,接下來的git gc --prune=now --aggressive只需要2分鐘。

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

+0

也是我們目前的文件不神聖 - 有無論如何有你的工具所有提交'頭' – megawac

+0

重新神聖: - 無blob保護是你的(可怕的)朋友! –

+0

好的整潔 - 看起來很有希望。無論如何要指定*** *** REMOVED ***文本,並且你的項目是否支持globbed路徑? – megawac

1

您不應該cd到另一個目錄,因爲git-filter-branch script將使用相對路徑來訪問文件。

+0

該腳本在其相關目錄中加載一些'.yml'文件,並且過濾器分支在回購路徑的上下文中執行該命令。 AFAIK theres沒有辦法設置'cwd'路徑 – megawac

0

考慮使用BFG。它使用起來更快更簡單。