99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Python調(diào)用Gitea API實(shí)現(xiàn)全量倉庫批量克隆與備份

Python調(diào)用Gitea API實(shí)現(xiàn)全量倉庫批量克隆與備份 Gitea用久了之后我一直缺一個(gè)趁手的Python插件一鍵把實(shí)例上所有倉庫的代碼全部拉下來。早先靠手動(dòng)復(fù)制地址再git clone倉庫少還行等團(tuán)隊(duì)倉庫破百組織、個(gè)人、鏡像倉庫混在一起這活兒就變成純體力活了。后來我花了點(diǎn)時(shí)間寫了個(gè)Python小工具對著Gitea API把倉庫列表、組織列表、Starred列表都翻了一遍然后自動(dòng)拼接clone地址批量下載。這篇文章就是把這個(gè)插件的完整思路、實(shí)現(xiàn)代碼和實(shí)際踩坑記錄整理出來寫給同樣在維護(hù)Gitea、或者想把Gitea倉庫遷走備份的開發(fā)者參考。先說清楚這個(gè)工具解決什么問題它能自動(dòng)遍歷Gitea實(shí)例上你有權(quán)限訪問的所有倉庫不管是用戶倉庫、組織倉庫還是你Starred的項(xiàng)目統(tǒng)一按目錄結(jié)構(gòu)拉取到本地支持HTTPS Token認(rèn)證和SSH兩種clone方式還能跳過鏡像倉庫、自動(dòng)重試、斷點(diǎn)續(xù)傳。如果你需要定期備份代碼、遷移Gitea到新服務(wù)器、或者給代碼審計(jì)/靜態(tài)掃描準(zhǔn)備一份全量源碼這個(gè)小插件可以直接抄作業(yè)。1. 為什么需要全量拉取Gitea實(shí)例維護(hù)者的核心痛點(diǎn)1.1 手動(dòng)clone到崩潰的臨界點(diǎn)我第一次意識到必須自動(dòng)化是一次服務(wù)器遷移。Gitea跑了快兩年上面有用戶個(gè)人項(xiàng)目、團(tuán)隊(duì)內(nèi)部庫、還有幾個(gè)從外部同步的鏡像庫加起來一百多個(gè)。當(dāng)時(shí)覺得不就是clone一下嘛結(jié)果手動(dòng)操作的時(shí)候發(fā)現(xiàn)要先在網(wǎng)頁上一頁一頁翻倉庫列表每頁50個(gè)然后看清楚哪個(gè)是組織倉庫、哪個(gè)是個(gè)人倉庫復(fù)制地址之前還得區(qū)分是走HTTPS還是SSH。折騰到一半網(wǎng)絡(luò)中斷個(gè)別倉庫clone到一半失敗我又得回去找是哪個(gè)倉庫沒成功。那一刻我就在想Gitea明明提供了完整的REST API為什么不用Python把所有倉庫信息拎出來一鍵批量clone后來我調(diào)研了一圈發(fā)現(xiàn)確實(shí)有不少人寫bash腳本做這件事無非是curl調(diào)API再用xargs跑git。但bash處理JSON還依賴jq而且邏輯復(fù)雜一點(diǎn)就難維護(hù)。我本身是Python技術(shù)棧平時(shí)也用Python做自動(dòng)化運(yùn)維干脆就自己寫一個(gè)Python插件把列倉庫、拼地址、調(diào)git clone、重試、跳過鏡像這些邏輯做成模塊化工具。1.2 Gitea API比GitLab簡單在哪如果你同時(shí)用過GitLab和Gitea的API應(yīng)該能感受到Gitea確實(shí)輕量。GitLab的權(quán)限模型很重一個(gè)Project掛在Group下面還要考慮Subgroup嵌套拉全量倉庫得遞歸遍歷Group。Gitea的結(jié)構(gòu)簡單直接用戶User、組織Organization、倉庫Repository三層而且API路徑非常直觀用戶倉庫GET /api/v1/users/{username}/repos組織倉庫GET /api/v1/orgs/{org}/repos當(dāng)前用戶信息GET /api/v1/user當(dāng)前用戶所屬組織GET /api/v1/user/orgsStarred倉庫GET /api/v1/user/starred這意味著你不需要遞歸很多層幾個(gè)接口就能拿到全部倉庫清單。另外Gitea自帶Swagger調(diào)試頁面默認(rèn)在/swagger路徑你可以在網(wǎng)頁上直接試API返回什么字段開發(fā)體驗(yàn)比對著文檔猜要友好太多。1.3 先劃清邊界這個(gè)插件不做什么寫工具之前最好先明確邊界不然會越搞越復(fù)雜。我的這個(gè)插件定位很清晰只做拉取源碼不做備份Gitea數(shù)據(jù)庫、不備份附件、不備份LFS大文件。Gitea本身有官方的備份命令gitea dump可以打包整個(gè)實(shí)例數(shù)據(jù)那是全量災(zāi)備方案。但如果你只是想要一份能直接打開看代碼、能直接提交的Git倉庫集合gitea dump出來的zip反而不好直接使用這時(shí)候用API遍歷加git clone的方式最合適。另外這個(gè)插件也不處理Gitea升級、倉庫權(quán)限變更這類管理操作它只是只讀地讀取倉庫元數(shù)據(jù)然后調(diào)用本機(jī)Git客戶端完成clone。這樣設(shè)計(jì)的好處是安全性高token只需要只讀權(quán)限不會對Gitea實(shí)例做任何寫操作跑在運(yùn)維機(jī)器上也很放心。邊界弄清楚之后代碼寫起來就快了。2. 動(dòng)手前的API功課Gitea的倉庫訪問模型2.1 認(rèn)證方式與token權(quán)限最小集Gitea支持Token認(rèn)證也支持Basic Auth但實(shí)際操作中推薦用Token。在Gitea頁面右上角點(diǎn)頭像進(jìn)入設(shè)置 - 應(yīng)用 - 生成新令牌勾選權(quán)限時(shí)注意勾選read:repository、read:organization、read:user這幾個(gè)就夠了。Token相當(dāng)于你的API鑰匙不要用管理員賬號的Token給普通運(yùn)維賬號開一個(gè)最小權(quán)限Token就行。我之前有一次就是因?yàn)門oken權(quán)限沒勾全調(diào)用/user/orgs接口能通但拿到組織列表之后再調(diào)組織的repos接口就返回401。排查了半天才發(fā)現(xiàn)是組織權(quán)限沒開。API調(diào)用時(shí)在請求頭里加Authorization: token {TOKEN}即可注意Gitea和GitHub不同它不要求Bearer前綴直接寫token就行。2.2 倉庫歸屬用戶、組織和StarredGitea的倉庫歸屬分三種用戶倉庫、組織倉庫、以及當(dāng)前用戶Starred的倉庫。批量下載時(shí)大部分人的需求是把用戶自己和所屬組織的倉庫全拉下來Starred的倉庫看情況可能是網(wǎng)上其他人項(xiàng)目不一定要下載。我建議的處理方式是用戶倉庫和組織倉庫默認(rèn)全量拉取Starred倉庫默認(rèn)跳過可以用參數(shù)--include-starred開啟。因?yàn)镾tarred倉庫不是你擁有的代碼只是關(guān)注列表拉下來會占用空間。在遍歷組織時(shí)要注意一個(gè)用戶可能屬于多個(gè)組織每個(gè)組織又有自己的倉庫所以邏輯應(yīng)該是先拉當(dāng)前用戶信息拿到用戶名。拉用戶倉庫列表。調(diào)用/user/orgs拿到所有組織列表。遍歷每個(gè)組織拉組織倉庫列表。合并兩個(gè)列表按倉庫名去重。2.3 分頁、字段選擇與一個(gè)預(yù)檢腳本Gitea API默認(rèn)分頁返回limit參數(shù)可以調(diào)但建議設(shè)為50或100。實(shí)際上Gitea API沒有強(qiáng)制限制limit的最大值但設(shè)太大會增加單次響應(yīng)時(shí)間也容易超時(shí)。穩(wěn)妥做法是寫個(gè)while循環(huán)當(dāng)返回列表長度小于limit時(shí)說明已經(jīng)是最后一頁。倉庫列表返回的JSON字段很豐富對我們有用的主要有字段說明name倉庫名full_name完整名稱形如owner/repoclone_urlHTTPS clone地址ssh_urlSSH clone地址forks_countfork數(shù)量mirror是否為鏡像倉庫empty是否為空倉庫在寫完整插件前可以先寫一個(gè)20行的Python預(yù)檢腳本把倉庫列表打出來看看。我用urllib標(biāo)準(zhǔn)庫就能完成這樣目標(biāo)機(jī)器上不用額外裝requests也方便跑在干凈的服務(wù)器上。import json import os import urllib.request GITEA_URL os.getenv(GITEA_URL, http://localhost:3000) GITEA_TOKEN os.getenv(GITEA_TOKEN, ) USERNAME os.getenv(GITEA_USERNAME, ) def fetch(path): req urllib.request.Request(GITEA_URL.rstrip(/) path) req.add_header(Authorization, ftoken {GITEA_TOKEN}) req.add_header(Accept, application/json) with urllib.request.urlopen(req, timeout30) as resp: return json.loads(resp.read().decode(utf-8)) repos fetch(f/api/v1/users/{USERNAME}/repos?limit50page1) for repo in repos: print(repo[full_name], | mirror:, repo[mirror], |, repo[clone_url])這段代碼跑通之后你已經(jīng)拿到了第一批倉庫。下一步就是正式插件里做組織和Starred的遍歷了。3. 插件代碼落地從列倉庫到真正clone3.1 項(xiàng)目結(jié)構(gòu)純標(biāo)準(zhǔn)庫也能跑寫這個(gè)插件的時(shí)候我沒有用第三方HTTP庫因?yàn)镚itea內(nèi)網(wǎng)環(huán)境往往沒有外網(wǎng)pip源裝requests有時(shí)候還得配代理麻煩。用Python標(biāo)準(zhǔn)庫urllib.request發(fā)請求用subprocess調(diào)git命令整個(gè)插件只依賴系統(tǒng)Git和Python 3.8可以說是零依賴。項(xiàng)目結(jié)構(gòu)我分成四個(gè)文件后續(xù)擴(kuò)展也方便gitea_downloader/ ├── __init__.py ├── api_client.py # Gitea API封裝 ├── clone_runner.py # git clone執(zhí)行與重試邏輯 ├── config.py # 配置讀取 └── main.py # 入口組裝完整流程如果你只是臨時(shí)用也可以把所有邏輯塞進(jìn)一個(gè)腳本。但我建議保留模塊化結(jié)構(gòu)因?yàn)楹竺婺愫芸赡芟爰又焕硞€(gè)組織的倉庫、過濾某個(gè)前綴的倉庫、導(dǎo)出倉庫清單CSV這類功能模塊化改起來輕松很多。config.py里我使用環(huán)境變量讀取配置這樣不會把Token寫死在代碼里import os from dataclasses import dataclass dataclass class Config: gitea_url: str token: str username: str target_dir: str use_ssh: bool False depth: int 0 include_orgs: bool True include_starred: bool False skip_mirror: bool True retry_count: int 3 classmethod def from_env(cls): return cls( gitea_urlos.getenv(GITEA_URL, http://localhost:3000).rstrip(/), tokenos.getenv(GITEA_TOKEN, ), usernameos.getenv(GITEA_USERNAME, ), target_diros.getenv(GITEA_TARGET_DIR, ./gitea_repos), use_sshos.getenv(GITEA_USE_SSH, 0) 1, depthint(os.getenv(GITEA_CLONE_DEPTH, 0)), include_orgsos.getenv(GITEA_INCLUDE_ORGS, 1) 1, include_starredos.getenv(GITEA_INCLUDE_STARRED, 0) 1, skip_mirroros.getenv(GITEA_SKIP_MIRROR, 1) 1, retry_countint(os.getenv(GITEA_RETRY, 3)), )3.2 API Client把三個(gè)來源的倉庫合并成清單api_client.py負(fù)責(zé)和Gitea API通信。我封裝了幾個(gè)方法get_user_info、get_user_repos、get_orgs、get_org_repos、get_starred_repos。分頁邏輯做成一個(gè)生成器遇到limit返回的列表長度小于請求數(shù)量就停止。import json import urllib.request from urllib.parse import urlencode class GiteaAPIClient: def __init__(self, base_url: str, token: str): self.base_url base_url.rstrip(/) self.token token def _get(self, path: str) - list: req urllib.request.Request(self.base_url path) req.add_header(Authorization, ftoken {self.token}) req.add_header(Accept, application/json) with urllib.request.urlopen(req, timeout30) as resp: return json.loads(resp.read().decode(utf-8)) def _paginate(self, path_template: str, limit: int 50): page 1 while True: path path_template.format(limitlimit, pagepage) items self._get(path) yield from items if len(items) limit: break page 1 def get_user(self) - dict: return self._get(/api/v1/user) def get_user_repos(self, username: str): return self._paginate(f/api/v1/users/{username}/repos?limit{{limit}}page{{page}}) def get_orgs(self): return self._get(/api/v1/user/orgs)這里有個(gè)細(xì)節(jié)_get的返回可能是對象也可能是數(shù)組分頁場景默認(rèn)是數(shù)組但get_user返回的是單個(gè)對象所以類型我做成了list是有點(diǎn)偷懶實(shí)際用的時(shí)候可以拆開或者加泛型。不過不影響主流程。合并倉庫清單的邏輯放在main.py里。注意去重full_name是唯一標(biāo)識同一個(gè)倉庫不會同時(shí)出現(xiàn)在用戶倉庫和組織倉庫里但為了穩(wěn)妥還是加個(gè)集合判斷。def collect_all_repos(cfg, api): seen set() repos [] def add(repo): if not repo.get(empty, False): key repo[full_name] if key not in seen: seen.add(key) repos.append(repo) user api.get_user() username user.get(login, cfg.username) if username: for repo in api.get_user_repos(username): add(repo) if cfg.include_orgs: for org in api.get_orgs(): org_name org[username] for repo in api.get_org_repos(org_name): add(repo) if cfg.include_starred: for repo in api.get_starred_repos(): add(repo) if cfg.skip_mirror: repos [r for r in repos if not r.get(mirror, False)] return reposget_starred_repos和get_org_repos我在對接時(shí)發(fā)現(xiàn)路徑稍有區(qū)別Starred走的是用戶Starred接口/api/v1/user/starred組織走的是/api/v1/orgs/{org}/repos。這兩個(gè)接口在Gitea里都能正常返回JSON數(shù)組但字段完全一致所以下游代碼可以共用add邏輯。3.3 clone策略HTTPS、SSH與淺克隆的取舍倉庫清單到了本地之后最核心的問題是clone地址選HTTPS還是SSH。我的建議是按場景區(qū)分一次性備份或下載用HTTPSToken可以寫在URL里或者用git -c http.extraHeader傳認(rèn)證信息。日常同步開發(fā)后續(xù)要推送修改用SSH需要在Gitea里配置SSH公鑰clone下來之后remote地址就是SSH推送不用輸密碼。代碼里我保留了兩個(gè)地址的切換def build_clone_url(repo: dict, use_ssh: bool) - str: return repo.get(ssh_url) if use_ssh else repo.get(clone_url)HTTPS方式下如果Gitea開了私有倉庫直接git clone會要求輸入賬號密碼。為了避免交互我在clone_runner.py里對HTTPS地址做了處理如果是http(s)://開頭就把Token拼到URL里只對fetch/push有效避免Token泄露到磁盤remote配置里所以用-c http.extraHeader更安全。def build_git_command(repo_dir: str, repo: dict, cfg: Config): if cfg.use_ssh: url repo[ssh_url] else: url repo[clone_url] if cfg.token and url.startswith(http): from urllib.parse import urlparse, urlunparse parsed urlparse(url) host_port parsed.netloc url f{parsed.scheme}://{cfg.token}{host_port}{parsed.path} cmd [git, clone] if cfg.depth: cmd [--depth, str(cfg.depth)] cmd [url, repo_dir] return cmd不過把Token拼在URL里的方式Git會在clone成功后把遠(yuǎn)程地址寫入.git/config并附帶Token這不太安全。我后來改成了用git -c http.extraHeaderAuthorization: token xxx的方式具體看你要不要在意這個(gè)細(xì)節(jié)。如果要寫進(jìn)自動(dòng)化腳本、定時(shí)任務(wù)建議用extraHeader。淺克隆參數(shù)--depth很重要。我的經(jīng)驗(yàn)是倉庫數(shù)量多、單倉庫歷史深的情況下淺克隆能節(jié)省大量時(shí)間。但要注意備份場景淺克隆可能拿不全歷史記錄所以我默認(rèn)參數(shù)GITEA_CLONE_DEPTH0也就是全量克隆。只有當(dāng)你明確只是臨時(shí)看看代碼、不需要?dú)v史時(shí)再設(shè)置成--depth 1。3.4 執(zhí)行器失敗重試和日志別讓腳本靜默死掉clone執(zhí)行是整條鏈路中最容易出問題的環(huán)節(jié)網(wǎng)絡(luò)抖動(dòng)、倉庫過大、權(quán)限不對都會導(dǎo)致clone失敗。clone_runner.py里我做了幾件事每個(gè)倉庫clone失敗后不中斷整個(gè)流程記錄錯(cuò)誤繼續(xù)下一個(gè)。失敗重試3次每次間隔5秒。輸出簡單日志當(dāng)前第幾個(gè)倉庫、倉庫名、成功還是失敗。import subprocess import time def clone_repo_with_retry(cmd, repo_full_name, retry_count3, delay5): for attempt in range(1, retry_count 1): try: proc subprocess.run( cmd, capture_outputTrue, textTrue, timeout1800, ) if proc.returncode 0: print(f[OK] {repo_full_name}) return True else: print(f[WARN] {repo_full_name} 第{attempt}次失敗: {proc.stderr[-300:]}) except subprocess.TimeoutExpired: print(f[WARN] {repo_full_name} 第{attempt}次超時(shí)) time.sleep(delay) print(f[FAIL] {repo_full_name} 重試{retry_count}次仍失敗) return False這里我設(shè)置timeout1800秒也就是單倉庫最多跑半小時(shí)。如果某個(gè)倉庫是大倉且有幾千個(gè)提交半小時(shí)足夠如果設(shè)定太短大倉庫會被誤殺。另外注意capture_outputTrue時(shí)如果倉庫太大stderr可能積累很多輸出所以我只截取最后300個(gè)字符打到日志里避免刷屏。4. 實(shí)測踩坑記錄從clone失敗到亂碼的各種情況4.1 Token權(quán)限不夠API能通但列表是空的我在寫這個(gè)插件的第2版時(shí)遇到過一個(gè)很隱蔽的問題用管理員Token在Swagger頁面上測試時(shí)所有接口都正常。但換到普通運(yùn)維賬號時(shí)/api/v1/user能返回用戶信息/api/v1/users/{username}/repos卻返回空列表。排查后發(fā)現(xiàn)是Gitea的Token權(quán)限模型里read:user和read:repository是分開的我只勾了read:user沒勾read:repository。這個(gè)問題好解決到Token設(shè)置頁面把read:repository也勾上即可。但我想提醒的是Gitea的Swagger頁面默認(rèn)用的是當(dāng)前登錄用戶的完整權(quán)限你在Swagger上測試成功不代表API Token也有同樣權(quán)限。調(diào)試時(shí)最好直接使用實(shí)際Token去訪問別用登錄態(tài)的Swagger來自我麻痹。4.2 鏡像倉庫clone之后一片亂碼Gitea支持把外部倉庫鏡像進(jìn)來比如從GitHub同步一個(gè)開源項(xiàng)目。這些鏡像倉庫在API里的mirror字段是trueclone它們時(shí)有些鏡像的.git目錄結(jié)構(gòu)和普通倉庫不太一樣更麻煩的是同步可能失敗導(dǎo)致倉庫處于半同步狀態(tài)本地clone出來的文件不完整甚至亂碼。我在第一版插件里踩過這個(gè)坑后來處理辦法是默認(rèn)跳過所有mirrortrue的倉庫除非你明確要鏡像內(nèi)容??梢约右粋€(gè)參數(shù)--include-mirror但默認(rèn)不要開。另外鏡像倉庫的clone_url指向的是Gitea實(shí)例自身的地址如果鏡像同步失敗clone下來的東西很可能不是最新狀態(tài)用戶看到亂碼文件時(shí)會以為是插件寫壞了。4.3 Gitea在Docker容器里運(yùn)行時(shí)clone地址不對我自己的Gitea是用Docker Compose部署的映射宿主機(jī)端口和容器端口。Gitea默認(rèn)對外地址如果配置的是http://localhost:3000那么API返回的clone_url也是這個(gè)地址。在宿主機(jī)上跑克隆沒問題但如果從另一臺機(jī)器跑插件clone_url就是錯(cuò)的git會嘗試克隆localhost。解決方法是配置Gitea的ROOT_URL為實(shí)際的對外訪問地址比如http://git.example.com。如果只是臨時(shí)用也可以在插件里對clone_url做字符串替換repo[clone_url] repo[clone_url].replace( http://localhost:3000, cfg.gitea_url )這條路子適合先跑通再說的情況長期還是要把ROOT_URL配對。做容器化部署的朋友要留意Gitea容器的GITEA__server__ROOT_URL環(huán)境變量必須設(shè)置為外部可訪問的域名或IP否則不只是這個(gè)插件任何自動(dòng)clone的工具都拿不到正確地址。4.4 Windows路徑和長路徑問題如果你在Windows上跑這個(gè)插件subprocess.run調(diào)git clone時(shí)要注意目標(biāo)路徑不能太長。Windows默認(rèn)路徑深度限制是260字符倉庫的嵌套目錄加上倉庫名很容易超。我在Windows測試時(shí)就遇到過Filename too long錯(cuò)誤。處理辦法有兩個(gè)一是用Python 3.6的os.path加上\\?\前綴二是直接改用git clone的--separate-git-dir或者干脆把目標(biāo)目錄層級壓平。實(shí)際操作中我建議把保存目錄結(jié)構(gòu)壓成owner_repo這種扁平命名避免owner/repo兩級目錄疊加后路徑過長。但扁平命名也有壞處就是同一個(gè)owner下的倉庫不能自然地按目錄分組??茨愕娜∩崃?。我通常按owner/repo保存在Linux服務(wù)器上跑沒有任何問題Windows就留給有特殊需求的場景。4.5 Git換行符和文件權(quán)限問題從Gitea clone下來的代碼如果倉庫里有.gitattributes換行符一般沒問題。但有些Windows團(tuán)隊(duì)提交的代碼帶著CRLF在Linux上clone下來后IDE打開會提示。這不是插件需要解決的但我建議clone完成后不要修改任何倉庫設(shè)置保持原樣方便后續(xù)git pull增量更新。文件權(quán)限方面Gitea倉庫里如果有shell腳本clone下來后chmod可能丟失。如果你要直接使用這些腳本記得統(tǒng)一加執(zhí)行權(quán)限find . -name *.sh -exec chmod x {} \;這個(gè)不是插件功能但批量clone場景下很常見順手記一下。5. 把下載器用起來備份、遷移與CI聯(lián)動(dòng)5.1 定時(shí)批量備份源碼到NAS既然能一鍵全量clone最直接的應(yīng)用就是定期備份源碼。我的做法是寫一個(gè)crontab任務(wù)每周日凌晨3點(diǎn)執(zhí)行一次下載然后把目標(biāo)目錄整體同步到NAS上的一個(gè)共享文件夾。增量更新的思路不要用普通的git clone而是后續(xù)用git pull --ff-only。但要注意如果你第一次是全量clone后續(xù)每次拉取可以用git -C {repo_dir} pull --ff-only。為了不把插件搞得太復(fù)雜我拆成了兩個(gè)模式download模式全量clone適合首次備份或重新初始化。update模式遍歷本地已有倉庫逐個(gè)git pull適合增量備份。update模式實(shí)現(xiàn)起來不復(fù)雜但要先判斷本地目錄是不是一個(gè)有效的Git倉庫。我的做法是檢查{repo_dir}/.git或者{repo_dir}/.git文件是否存在Gitea如果用的是worktree有可能.git是一個(gè)文件。def is_git_repo(path: Path) - bool: git_path path / .git return git_path.exists()然后對每個(gè)目錄執(zhí)行g(shù)it -C {path} pull --ff-only如果pull失敗記錄下來不阻塞其他倉庫。5.2 從Gitea遷到GitLab時(shí)這個(gè)插件是搬運(yùn)工熱搜詞里能看到大家經(jīng)常對比GitLab和Gitea。如果你想把Gitea遷移到GitLab或者反過來官方工具多少有點(diǎn)限制但用這個(gè)插件配合GitLab API做鏡像就能實(shí)現(xiàn)手動(dòng)遷移。流程是用插件把Gitea所有倉庫clone到本地。在GitLab那邊用API創(chuàng)建空項(xiàng)目Group Project。給本地倉庫添加新的remotepush上去。關(guān)鍵點(diǎn)是push時(shí)要把所有分支、標(biāo)簽都推上去。普通git push origin --all能推分支但標(biāo)簽要用git push origin --tags。如果倉庫是SVN遷移過來的可能還有奇怪的分支結(jié)構(gòu)建議push之后核對一下。git -C {repo_dir} remote add gitlab git{gitlab_host}:{group}/{project}.git git -C {repo_dir} push gitlab --all git -C {repo_dir} push gitlab --tags如果你的倉庫很多這個(gè)流程建議用腳本批量執(zhí)行別手敲命令容易漏。5.3 與Jenkins/Drone流水線配合Gitea生態(tài)里常見的是Gitea Drone或者Jenkins Gitea做CI/CD。有些流水線需要預(yù)先拉取所有倉庫到構(gòu)建機(jī)尤其是做代碼掃描、統(tǒng)一構(gòu)建的時(shí)候。這個(gè)下載插件可以變成CI的一個(gè)前置步驟構(gòu)建機(jī)啟動(dòng)時(shí)先執(zhí)行一次全量拉取然后各個(gè)Job從本地倉庫目錄直接取代碼避免每個(gè)Job都去Gitea上重復(fù)clone。這種做法對網(wǎng)絡(luò)和Gitea壓力都很友好。我在實(shí)際使用中把下載器做成一個(gè)Python CLI然后被Jenkins的Pipeline調(diào)用stage(Fetch all repos from Gitea) { steps { sh export GITEA_URLhttp://git.example.com export GITEA_TOKENxxx export GITEA_USERNAMEci-user export GITEA_TARGET_DIR/data/code_cache python3 -m gitea_downloader download } }要注意的是CI環(huán)境里一般沒有交互式shellclone失敗重試沒問題但Token千萬別打印到日志里。我在main.py里已經(jīng)對Token做了脫敏處理日志只會輸出倉庫名和clone結(jié)果不會出現(xiàn)URL里的Token。5.4 代碼統(tǒng)計(jì)和倉庫健康檢查的延伸倉庫清單拉下來之后其實(shí)還能做很多事。比如分析哪些倉庫超過1GB、哪些倉庫最近一年沒有提交、哪些倉庫的分支數(shù)量異常多這些都能直接讀.git目錄統(tǒng)計(jì)。我之前就寫過一個(gè)簡單統(tǒng)計(jì)腳本import subprocess from pathlib import Path base_dir Path(/data/gitea_repos) for repo_dir in base_dir.iterdir(): if not (repo_dir / .git).exists(): continue result subprocess.run( [git, -C, str(repo_dir), count-objects, -vH], capture_outputTrue, textTrue ) size_line [l for l in result.stdout.splitlines() if l.startswith(size-pack:)] if size_line: print(repo_dir.name, size_line[0])把這些信息輸出成CSV或直接推送到監(jiān)控系統(tǒng)你就有了Gitea代碼倉庫的全景視圖。這個(gè)是當(dāng)初意外收獲現(xiàn)在也成了我維護(hù)Gitea的常規(guī)工具之一。就我個(gè)人經(jīng)驗(yàn)來說寫這個(gè)插件的最大收獲不是能批量clone而是理解了Gitea API的邊界和踩坑點(diǎn)。如果你也在維護(hù)Gitea建議先跑一遍預(yù)檢腳本確認(rèn)API能正常返回再套用完整插件。token權(quán)限、鏡像倉庫、ROOT_URL這三個(gè)坑是最常見的提前處理能省很多事。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
淑女丝袜bi操逼123| 久久久精品色| 丁香五月六月综合激情| 超碰操日| 婷婷爱五月| 九九精品视频在线6| 日韩一级网站| 色综合9| 婷婷色丁香五月| 色吧五月婷婷六月丁香| 天天搽天天射| 五月婷婷无码| 五月丁香六月综合基地| 婷婷综合日本| 一级性爱大片| 色情五月天导航| AV电影在线播放| 天天插天天日| AV成人在线播放| 天天综合天天玩夜夜玩天天玩夜夜玩| 99热20| 91viP在线看| 韩日AV片| se99热久久一本| 亚州欧美黄色电影| 五月丁香六月婷婷激情四射| 91人妻人人操| 永久天堂日本| 天天综合久久| www.91.com黄| 五月天婷婷色在线视频免费观看| 九九Av| 久久影视婷婷五月| 色99在线视频| 成人精品一区二区三区四区五区| 99re热| 欧美99热| 色五月婷婷丁香国产在线| 久9热视频在线观看| 综合www色| 综合色视频| 美女久久婷婷| 日韩精品无码AV| 婷婷丁香18| 精品人妻伦九区久久AAA片| AV在线观看网站| 亚洲另类视频| 五月天丁香网| 风流少妇A片一区二区蜜桃| 日日操夜夜爽| 三级毛片视频| 大香蕉75线| 最新婷婷五月丁香| 91丁香五月| 狠干综合| 26UUU| 性爱动图国产麻豆一区二区三区| 99精品网站| 五月综合亚洲| 超碰在线超碰| 狠狠综合| 超碰妻人人| 综合色七七| 五月婷婷性爱网| 激情五月天婷婷丁香| 午夜成人av在线| 91猫咪国产在线播放| 丁香五月婷婷综合激情啪啪啪啪啪啪啪| 婷婷六久久| 婷婷丁香六月天激情四射网| 五月天丁香成人| 色综合大香蕉| 亚洲久久婷婷丁香五月天| 天天射射夜| 久久机只有这里精品| 思思国产99| 夜夜撸日日操| 99精品免费| 欧美色一级色| 九九色精品| 五月天激情在线视频| 五月婷色丁香| 大香蕉人妻| 色99视频| 女操碰| 淫视馆aV二区一区| 五月天五月天激情网| 中文av网| 日韩成人精品中文字幕电影| 丁香婷婷基地| 五月婷婷五月丁香| 青青草伊人婷婷| 91好好热日本在线| 婷婷色五月情| 久操热线| 停停色综合伊人| 婷婷五月天天aV| 日本婷婷| 果冻传媒A片一二三区| 久久婷综合网| 色J香五月天| 久久人妻久久| 日本视频99| 再綫Av免费視品| 人人爽亚洲| 99自拍网| 婷婷伊人75| 五月丁香六月婷婷中合网| 丁香婷婷视频| 五月婷婷激情在线| 俺也去综合| 人妻AV在线| 中文字幕无线久必| 婷婷五月丁香婷婷| 日本天天色| 操逼巨乳91| 在线五月色播| 色99在线| 婷婷色五月噜噜| 天天日 天天草| 中文字幕在线日亚洲9| 蜜乳人妻一区二区三区| 99re热视频这里只精品5| 中字幕视频在线永久在线观看免费| 婷婷五月天丁香久久| 欧日美女Va| 狠狠色丁香婷婷久久综合| 色婷婷8| 超碰91av| 丁香五月在线| 婷婷激情伍月网| 夜夜爱网站| 久久无码成人| 战争与艾拉电影免费观看| 天天爱天天操| 丁香五月天天| 一本大道嫩草AV无码专区| 夜夜躁婷婷AV| 亚洲操B视频| 五月婷婷综合色啪首页| 狠狠干五月| 青青热久精品视频在线观看| 思思久久99热只有频精品66| 色婷婷国色天香综合| 欧美日韩999| 丁香五月婷婷亚洲另类| 色九月婷婷丁香| 婷婷综合天堂| 丁香六月婷| 123日本不卡在线| 日本色婷婷久久99精品91| 久久久久9| 91精品丝袜久久久久久| 五月丁香综合啪啪| 青青草婷婷综合五月| 八戒青柠影视剧在线观看| 狠狠色丁香久久久婷| 五月天色图| 色噜噜狠狠色综合网| 激情噜噜噜| WWW99视频| 99色视频| 五月天开心激情网色欲无码| ..真实国产乱子伦毛片| 色五月激情五月| 久久五月婷婷视频| 五月丁香免费看| 婷婷色色网| 操99| 伊人AV五月婷| 五月丁香色色网| 色久综合| 丁香五月婷久久| 亚洲天堂无码| 久久草大香蕉| 久久偷拍综合五月天| 99综合成人视频在线观看 | 天天干夜晚夜操| 亚洲另类在线观看| 久久九九Com| 五月丁香激情婷婷| 26uuu视频欧美| 无码少妇高潮喷水A片免费| 亚洲色婷婷网站| 中文字幕1区2区。| 久久婷网| 五月天五月婷五月激情网| 色婷婷另类| 欧美色色色色色色色| 五月天啪啪| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 国产成人网站在线观看| 色婷婷先锋| 中文字幕av网站| 9久久久久| AAAA亚洲| 久碰久操| 丁香青青五月天| 色五月首页| 日日射天天射| 亚洲婷婷五月天在线激情综合网| 韩日AV片| 极品人妻VIDEOSSS人妻| 狠狠色婷婷777| 夜夜爽日日躁| 日韩色色网| 国产五月视频| 国产成人+综合亚洲+天堂| 麻豆五月丁香婷婷| 天天草婷婷五月| 久久全色| 狠狠色中色| 五月激情六月综合| 91人人网| 四月婷婷五月丁香| 夜夜操,天天撸| 欧美色图45678| 9久热在线精品| 国产激情久久久| 五月天婷婷激情在线色图| 精品乱码视频| 成人AV在线电影| 日本久久久97| 久久视9精| 国产精品美女| 色吧综合网| 婷婷激情人妻| 日韩淑女人妻luan伦激情精品一区二| 六月丁香婷婷五月| 丁香五月六月欧美| 天天日,夜夜爽| 这里只有精品在线视频精品| 日韩婷婷五月| 丁香五月激情六月欧亚激情综合导航| AV成人在线播放| 99惹 精品在线| 天天日天天色| 色色五月天激情| 五月天色色婷婷| 五月丁香啪啪综合| 亚洲日日日| 婷婷五月天成人网站| 99热在线爱| 九九激情网| 99九九在线观看免费| 欧美丁香五月| 97色欧美| 五月天无码| 7超碰自拍| 98永久精品| 91猫咪国产在线播放| 98国产精品综合一区二区三区| 色综合色色色| 久久精品99国产精品日本| 五月婷婷片| www.夜夜操.com| 五月婷婷色| 色墦五月丁香| 内射爽无广熟女亚洲| 91超级碰碰碰| 综合久久十三| 激情国产综合| 亚洲成人在线免费| 青草性爱视频| 婷婷丁香五月综合激情小说| 丁香五月AV| 亚洲va成人va成人va在线观看| 五月婷婷开心网| 丁香婷婷五月天在线视频| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 96精品久久久久久久久| 激情综合5| 在线观看五月婷婷网| 成人色站,在线视频,看片-SS1AV| 丁香六月婷婷色XXXX| 丁香激激情网| 热五月婷婷| 狠狠搞狠狠操| 五月婷婷综合天天操| WWW.HENHENL.| 日韩久久视频| 五月天婷婷导航| 丰满熟女人妻一区二区三| 99热国产免费| 亚洲亚洲人成综合网络| 婷丁香五月天| 黄涩毛片| 影音先锋一区| 99久操视频| 激情婷婷网| 婷婷丁香激情综合色情| 九九草热在线观看| 操碰99| 久久九九99| 国产视频色色色色色色色| 色yeye欧美| 婷婷丁香成人| 天天插天天操| 五月天激情婷婷| 亚洲成人av在线观看| 欧美三日本三级少妇三99| 婷五月丁香俺| 五月婷婷日| 亚洲色热| 激情视频91| 婷婷五六月丁香| 日日舔夜夜操| 免费无码毛片一区二区A片| 色碰97| 《诡秘之主》在线观看| 狠狠色五月天| 婷婷五月天综合久久日美女| 激情五月图| 激情五月天com| 婷婷五月丁香五月| 一级性感黄色内射视频| 噜噜吧天天爱| 9热在线| 日韩无码专区| 久久综合影院 | 黄色一极大片| 欧美啄木乌丝袜人妻系列| 亚洲欧美成人在线| 第五婷婷伊人丁香| 婷婷五月丁香综合激情| 成人AV在线中文版| 婷婷中文字幕版| 亚洲综合九九| 91精品在线看| 爆乳熟妇一区二区三区爆乳照片| 9 1大香蕉| 丁香五月激情月| 一级性爱视频| 激情综合色网| 1024国产| 久久久久亚洲AV无码网影音先锋| 爱婷婷都市激情| 91熟妇大香蕉| 深情五月天| 欧类av怡春院| 噜噜噜噜在线| 日本性视频| 人妻五月天激情开心网| av国产精品| 五月天婷基地| 被强行糟蹋的女人A片| 国产精品久久久久久白浆色欲| 丁香五月六月综合欧美| 婷婷五月天情色| 天天综合中文| 9久久久| 五月婷婷丁香综合| 五月天激情图片网| 婷婷99热| 色综合com| 欧美丁香五月97色| 久久黄A片| 国产亚洲色婷婷久久99精品91| 大香蕉Av在线| www.久久久久| 99高级会所久久| 丁香六月婷| 激情综合4月| 另类小说五月天| 大香蕉九九| 日日夜夜婷婷| 婷婷丁香人妻| 操逼五月天| 婷婷五月天成人网| 丁香婷婷久久| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 亚洲国产黄色电影| 六月婷婷色综合| 第四色五月婷婷| 五月婷婷色影院| 99热老网站| 六月激情网| 天天色天天干天天插| 久久人妻熟女一区二区| 99国产在线| 丁香五月六月综合激情| 欧洲第一无人区观看| 五月婷婷六月激情网| 婷婷综合在线网| 婷婷丁香人妻天天爽| 六月婷婷久久| 欧美私人家庭影院| 欧美日本另类| 啪啪啪啪五月天| 丁香婷婷五月天成人| 99色网站| 情五月亚洲婷婷| 青青草99re| 人妻久热| 亚洲va欧美va国产综合久久久| 99热国产婷婷| 国产美女无遮挡裸体毛片A片| 婷婷五月天免费| 丁香五月777| 久久精品性爱| 五月六月丁香激情| 婷婷五月天激情综合婷婷五月天激情综合| 激情久久网 | 九伊人网| 国产偷人爽久久久久久老妇APP| 色五月丁香六月欧美综合| 成人版视频在线观看| 亚洲欧洲另类| 97碰碰视频在线观看| 天天操九九插| 超碰人人操人人干| 婷婷激情四射五月天| 六月激情婷婷| 久久五月网| 色久免费| 天天色一道本综合婷婷| 肏屄色播伊人97婷婷| 精品一二三区久久AAA片| 天天综合五月| 丁香六月成人| 婷婷五月天手机版视频| 丁香六月色香蕉视频| 丁香五月97视频| 影音先锋女人AA鲁色资源| 高清无码视频网址| 五月婷婷九月婷婷九月婷婷| 五月天婷婷午夜丁香| 国产色视频网站2| 色婷青青| 日本人人超碰| 亚洲精品一区中文字幕乱码| 夜夜爽天天爽| 色九区| 天天爽,夜夜爽| 26uuu激情五月天| 91精品婷婷国产综合久久| 国产黄色大片| 操97在线观看| 大香蕉色婷婷伊人在线| 嫩草AV久久伊人妇女超级A| 久久综合丁香| 亚洲视频操| 婷婷播5月| 五月久久亚洲| 99精品爱| 99色一| 亚色网站小视频| 色五月婷婷久久| 啪啪 综合网| 五月天丁香欧美激情| 色色亚洲99com| 四川BBB搡BBB爽爽视频| 婷婷情色开心五月天99| 中文字幕日本最新乱码视频| 精品亚洲国产成AV人片传媒| 少妇出轨做爰高潮A片| 啪啪啪大香蕉| 国产精品A成V人在线播放| 人人操AV| 国产熟妇的荡欲午夜视频| 五月丁香在线| 欧美韩国日本| 99燥99日| 色噜婷婷| 99热热热国产超碰| 内射综合网| 久久久久亚洲AV无码网影音先锋| 大香蕉啪啪| 亚洲成av人影院| 色丁香久久久| 99re8在这里只有精品| 日韩视频99| 九九无码| 人人摸人人| 大香蕉综合在线| 婷婷色婷婷| 99热久| 99精品国产乱码久久久人妻| 天天综合天综合久久网| 亚洲国产另类av| 国产综合81p| 欧美激情综合色综合啪啪五月| www.婷婷.com| 丁香五月婷婷久久久| 日本va网站| 综合图区激情| 五月婷婷色播| 思思热在线观看| 五月婷婷操操| 夜夜躁婷婷AV| 六月婷婷色五月| 一本综合丁香日日狠狠色| 丁香桃色网| 成人在线视频网| 久久久久9| 好叼操在线观看| 五月开心久久| 国产探花AV在线| 大香蕉婷婷丁香| 丁香五月天婷婷在线视频| 啪啪啪啪五月天| 99热免| 自拍偷窥99热| 激情五月天婷婷播播久久综合91| 开心五月婷婷婷美女| 五月综合亚洲色| 久久深爱激情网| 日韩 中文 欧美| 欧美大肥婆大肥BBBBB| 成人无码中文| 亚洲性爱干干| 玖玖在线视| 亚洲最大成人综合网720P| 9热在线视频精品| 久久欧洲久久| 六月婷婷久久| 伊人大香蕉毛片| 九九久久综合| 俺去也五月| 丁香五月社区| 婷婷中文无码| 99久在线精品99re8热| 婷婷五月av| 激情熟女网| 色五月天天| 在线观看的av| 婷婷丁香91| 色婷婷五月天天天做| 97色女人在线| 色开心五月丁香| 色播五月天天| 丁香五月天综合| 欧美乱码国产一级A片| 开心五月婷婷激情网| 亚洲99热| 丁香五月天网站| 99热这里只有精品86| 天堂无码人妻精品AV一区| 97人妻碰碰碰久久香蕉| 九九九九这里只有精品| 99视频在线9| 精品视频99看在线视频| 久久九九热视频| 九九视屏| 六月天婷婷| 国产免费一区二区三州老师F1……| 丁香综合婷婷开心激情网| 亭亭玉月丁香| 青青久久大香蕉| 久热只有这里精品| 91九色PORNY肉丝在线| 久久视频这里都是精品| 99自拍视频在线观看| 人人摸人人操人人爽| 五月婷婷九| 91综合色噜噜| 亚洲色五月婷婷| 激情色情五月天| 成人综合伍月天| 伊人99久久| 色色亚卅| 潮汕成人AV片在线| 色五月婷婷综合| 婷婷99狠| 人人视频人人干人人做| 99玖玖精品| 久热这里只有精品99re| 欧美三级视频下载| 日韩精品一品二区三区的使用体验| 丁香综合久久| 五月天综合激情网| 亚洲综合九九| 婷婷久久大香蕉| 成人婷婷桔色| AV亚洲在线| 99热.com| 五月色婷婷影院| 99热精品在线播放| 婷婷区日本| A片试看50分钟做受视频| 婷婷六月开心网| 激情小说色五月| 天天插天天操| 五月丁香六月综合基地| 久久婷婷亚洲| 五月天伊人手机在线播放AV| 男人視頻站| 五月丁香久久久久| 九九热只有这里是精品| 狠狠色婷| 中文字幕永久免费| 涩涩涩婷婷| 婷婷六久久| 五月婷婷偷拍| 婷婷一本和五月丁香| 中文字幕不卡网站| 午夜成人网站在线观看| tingting五月天亚洲| 1024AV视频| 可以免费观看的av| 翔田千里aV中文字幕| 高清a片基地| 丁香五月综合激情性爱| 袁子仪视频观看| 日本A片一区| 中文无码婷婷| 色婷婷综合网站| 久久五月激情综合| 欧美顶级少妇做爰HD| 激情综合五月开心狠狠| xxxx五月激情| 影音先锋偷偷色男人站| 国产成人精品一区二三区熟女在线 | 久久久精品AV| 综合激情五月丁香| 五月婷啪啪| 免费观看全黄做爰的视频| 色婷婷五月综合| 26UUU成人网| 丁香婷婷婷五月综合色情| 超碰在线人妻| www.日本91| 伊人超碰| 婷婷综合欧美| 久久天堂加勒比| 日本欧美成人片AAAA| 99久久五月婷婷| 日韩欧美四五区| 激情综合网五月| 色噜噜狠狠狠狠色综合久欧美| 久久人操| WWW.17C亚洲精品| 天天爽曰日爽| 第2色五月婷| 综合激情肏逼网| 另类丁香五月天区图| 婷婷金品综合视频| 久热超碰91| 丁香婷婷六月在线资源观看| 无码网| 色三级色三级| 丁香五月婷婷亚洲另类| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 久久婷婷五月综合网| 婷婷伊人綜合中文字幕| 色综合久久888| 色99在线观看| 玖玖热视频| 丁香五月,激情五月,深爱五月| 99噜噜噜在线播放| 九热视频| 日本91在线| 激情啪啪五月| www.久久婷婷| 99视频在线啪| 熟女国产在线一区二区三区四区| 久久婷婷丁香花综合网| 少妇人妻丰满做爰XXX| 激情五月综合亚洲另类| 亚洲国产99| 色情综合网| 99精品自拍| 亚洲无线视频| 九九人人操| 日本91在线| 狠狠色婷婷777| 色婷精品91| 琪琪色五月天| 色区久久| 天天做天天爱| 97人人干| AAA级久久久精品| 成人在线观看精品| 中文字幕操比影片| 亚洲激情Av| Aα在线免费观看| 中文字幕婷婷在线| 91凹凸在线| 丁香婷婷色| 丁香六月激情综合| 亚洲 日韩色色| 婷婷六月丁香久| 欧美综合丁香网| 播五月丁香六月| 天天综合在线网| 99热这里只有精品9| 久久久久久97| 五月天婷婷丁香| 99网| 伊人久热91| 日本激情91| 女人露出p毛视频www网站| 欧美激情 日韩无码 婷婷 五月天| 成人婷婷色五月天| 婷婷五月天偷拍| 丁香五月天视频| 在线播放成人网站| 91丁香综合| 在线综合91| 亚洲精品国产成人AV在线| 99re这里只有精品免费| 亚洲aV写真天天综合网久久| A在线观看| 激情av| 婷婷热色| 国产亚洲在线观看| 日本成人小说婷婷六月| 丁香久月| 免费看欧美成人A片无码| 9久热视频| 亚洲精品视频在线播放| 九九九激情网| 丁香激情久久| 爱婷婷久久视频| 六月婷婷啪啪| 中文字幕日本最新乱码视频| 丁香五月综合首页| 色五月婷婷少妇人妻| 99er精品视频| 俺去也综合| 99综合入口| 天天艹天天综合网| 五月婷婷69| 色色99| 五月丁香在线观看99| 综合久久婷婷五月丁香| 国产激情婷婷| 疯狂做受XXXX高潮A片| 婷婷五月电影| 成人综合伍月天| 丁香六月婷婷久久综合| www.色九月| 狠狠色五月| 91九色在线| 九九九九中文字幕| 激情五月天网页| 亚洲第一第二网站| 99久操| 丁香婷婷色五月天| 色综合久久久久| WWW.久久久久久久| 五月婷婷六月少妇激情| 男女啪啪做爰高潮无遮挡| 久久久8| 色播播婷婷| 亚洲黄网AV| 丁香六月婷月91婷月| 蜜桃人妻无码AV天堂三区| 亚洲狠狠爱婷婷| 伊人久久激情图区五月| 婷婷永久在线| 六月丁香六月婷婷欧美| 婷婷播5月| 欧美在线ee日韩| 狠狠干2007| 色色婷婷丁香| 欧美成性色| 99re思思久久| 久热91| 丁香色综合| 婷婷丁香五月91| 五月天六月婷婷| 五月色亭丁香| 香蕉AV777XXX色综合一区| 久久精品无码一区| 五月天色导航| 色爆五月| 天天综合天天玩夜夜玩天天玩夜夜玩 | 性爱视频久久| 婷婷色片| 2017人人操| 九九热99视频在线| 色五月成人| 色色色色色色色色色色色色色97| 激情五月婷婷开心网| 丁香五月婷婷www..com| 色五月婷婷色五月婷婷色五月婷婷| 91干婷婷| A久网| 极品五月天| 五月六月丁香激情| 色www.con| 天堂久久婷婷| 超碰国产在线| 五月丁香啪啪啪| 久久黄色网扯| 婷婷丁香无码专区| 人人草人| 另类视屏| 99综合视频一体| 欧美成性色| 少妇高潮呻吟A片免费看软件| 一本久久亚洲五月婷婷| 99五月香婷婷丁香在线视频| 国产VA亚洲VA96| www热久久yy9| www.yw尤物| 国内婷婷丁香社区在线播放| 亚洲激情四射色| 另类小说激情五月天| 射久久丁香五月| 日本欧美在线| 丁香婷婷六月天| av超碰在线| www色五月| 五月丁香五月丁香| 1024成人免费看| 波多野结衣AV无码Porn| 99爱视频精品在线观看| 亚洲成人无码专区| 成人在线99| 五月婷婷黄色| 97碰碰叉| 九色视频91| 人妻videos人妻高清| 五月激情婷婷四射| 啪啪91| www.色五月天.com| 9热精品| 白人荫道BBWBBB大荫道| 久久a热| 久热只有这里有精品| 天天日日| 亚洲色99| 婷婷色色欧美| 另类五月婷婷| 天天操五月天| 国产午夜精品一区二区三区四区| 999热这里只有精品| site:xmssd.com| 久久一级免费黄色片| 可以免费观看的av| 综合网五月| 亚洲激情丁香五月基地| 久久香蕉福利| 色婷婷yy久| 99热都是精品| 激情综合网色播五月| 激情五月综亚网| 97香蕉久久超级碰碰高清版 | 丁香五月亚洲激情婷婷射| 大香蕉丁香婷婷| 极品人妻VideOssS人妻| 激情小说婷婷| 久久人妻系列| 天天爽天天爽天天爽天天爽天天爽| 超碰2021| 国产成人精品一区二三区熟女在线| 五月综合色| 久久99这里只有精品视频| AV在线资源| 九九re视频在线视频| 99ER热精品视频| 色色五月婷婷| 91久久色| 直接看的AV| 五月天婷婷久久综合| 亚洲人妻av| 日韩淑女人妻luan伦激情精品一区二 | 在线99色| 热久免费视频9| 亚洲国产无线乱码在线观看| 99操逼| 九九99香蕉在线视频播放| 亚洲人人操BD| 日日干日日s| 日日爱678| 国产成人av在线| 精品99在线观看| WWW.五月com| 亚洲狠狠丁香婷婷香蕉| 少妇性BBB搡BBB爽爽爽电影| 亚洲色五月| 欧美日韩aaa| 另类天堂| 亚洲AV综合在线观看| 激情婷婷六月天| 99热免| 久久九九蜜| 三十路磁力链接| 五月激激网w'w'w| 亚洲人人96@| 日日干日日色| 亚洲婷婷开心五月| 婷婷丁香六月影视| ji'qing'luan'ren'lun| 桃色伊人在线| 天天干天天干天天干天天干天天干天天| 丁香五月综合久久八| 六月婷婷天天操夜夜爽视频| 亚洲一个色| 欧美激情综合| site:wpjngj.com| 97激情五月天| 六月婷婷影院| 六月丁香影院| 色综合天天综合成人网| 天天日日夜夜| 色五月天激情| 天天爱天天爽| 欧美槡BBBB槡BBB少妇| 欧美性生交XXXXX无码小说| 乱乱av| 婷婷五月丁香四射| 久久婷婷资源| 五月丁香啪啪综合网| 九九人人操| 青青夜夜狠狠夜夜狠狠| 五六月丁香激情视频| 丁香综合网| 另类图片五月天| 大香蕉精品视频| 五月婷婷激情网| 99在线精品免费视频| 婷婷六月香| 久久婷五月综合| 激情综合啪啪啪| 99热这里只有精品23| 日日噜狠狠色| 9 1超碰九色| 五月丁香啪| 26uuu成人网| 日本97在线视频| 激情小说婷婷小说| 99日韩网站| 激情综合九月| 777精品久无码人妻蜜桃| 久综合4| 婷婷操久久| 无码天天操| 日本在线va| 久久丁香五月天| 国内精品99| 内射综合网| 天天日人人爽| 丁香九月综合激情| 久久99国产综合精品免费| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | www.主妇. com| 五月丁香六月情亚洲| 日韩超碰在线| 嫩草AV久久伊人妇女超级A| 人妻操日日| 久久综合激情五月天| www激情com| 性综合网| www.色色com| 亚洲人人96@| 狠狠穞A片一區二區三區| 激情五月婷婷综合| www综合久久| 丁香五月婷婷动漫| 夜夜久久综合网| 一级AV片| 超碰狠狠操| 五月丁花六月丁香综合| 天天插天天插| 婷婷色吧| 激情五月狠狠| 狠狠操狠狠插| 91丨九色丨白浆秘| 人草人人| 国产露脸150部国语对白| 在线观看中文字幕亚洲| 久热精品视频| 乱岳熟女50岁| 婷婷性爱影院| 激情五月婷| 99色热综合| 99色最新在线视频| 91精品久久久久久77777| 99热日本精品| 丁香婷婷色五月合集| 日日撸夜夜操| 9久热在线视频精品| 天天操夜夜爽歪歪| 爱久久小说下载网| 人人澡天天色天天做| 成人综合AV| 久热婷婷在线视频| 丁香五月欧美色综合| 伊人五月天| 99re思思热在线视频| 久久婷狠狠色| 91人人操| 五月天伊人网| 国产操逼视频网站| 米奇影视五月天| 亚洲最大成人综合网720P| 深爱婷婷基地| 久久只有18视频| 丁香六月婷婷综合激情欧美| 九九热婷婷| 欧美精品A片一区在线观看| 欧美成人精品老美女噜噜噜| 9色91视频| 人人色AV| 操人妻AV| 亚洲男人的天堂婷婷色五月| 国产精品久久久久9999小说| 狠狠夜夜五月丁香| 99热这里| 天天日,天天射,天天插| 久久99网| 丁香五月婷婷亚洲色图| 这里只有精品久久| 激情五月天在线观看色婷婷| 丁香激情久久| 成人在线日韩| 五月天激情网图片| 无码一区二区三区四区五区| 五月激情小说| 妻久久久久| 97干干干丁香| 国语精品探花| www.91AV.COM| 丁香六月综合激情| 色v综合网| 色婷婷综合网| 激情五月图| 国产午夜成人免费看片无遮挡| 91dy.av| 色激情网| 无码99| 玖玖爱综合网| 日本色婷婷| 亚洲看av的网站| 一本久婷婷综合| 殴美日韩成人| 秋霞免费三级片| 日产精品久久久久久久蜜臀| 天天射综合网夜夜操| 一区二区三区四区牛| 大香蕉99| 欧美激情 日韩无码 婷婷 五月天| 2018国产大陆天天弄| 久热a| 九九综合网色全集 | 丁香桃色网| 久久精品视频99| 国产成人精品一区二三区熟女在线| 国产一区男女| 五月婷婷激情日本| 99热一区| 一级二级香港秋霞欧美欧美秋霞| 99久精品| 九九伊人网| 天天狠狠干| 大香蕉婷婷丁香天堂AV| 国产亚洲精品久久久久苍井松| 思思热精品在线观看| 97人凄人人操人人爽| 无码少妇高潮喷水A片免费| 婷婷五月天久久久| 丁香六月婷婷久久综合| 99超碰欧美| 超碰激情网| 激情五月色综合国产精品| 成人色图情色成人网 www.5b5b5bcom 五月天 | 色婷婷在线视频观看| 黄色成人网站在线播放| 伊人超碰| 91丨九色丨白浆秘| 一区二区成人电影免费播放| 91色逼| 婷婷免费无视频| 五月综合丁香婷婷| A片天天| 99碰碰| 深爱激情婷| 成人五月天色天堂| 五月婷久久草| 影音先锋91在线资源站| 袁子仪视频观看| 99原创自拍视频在线观看| 五月丁香六月久久| 91丁香色五月| 超碰免费人人| 热99在线精品| 精品久久久久久久久久久久人妻| AV在线免费网站| 先锋影音男人的天堂AV| 99热这里只有精品8| 色色色色热| 色婷婷影音| 婷婷五月激情四月综合 | 涩涩涩五月天| 五月丁香激情综合网| 激情五月综亚网| 五月丁香综合| 少妇婷婷五月天| 激情五月黄色| 欧美色五月| 婷婷五月电影院| 九九热这里| 狠狠色婷婷六月激情网| 色色啊| 97碰免费视频在线| 婷婷五月丁香香蕉| 亚洲殴洲精品Av在线| 极品人妻VIDEOSSS人妻 | 成人无码免费一区二区中文| 五月天婷婷激情小说电影| 思思热在线观看| 韩国天天婷婷| 丁香五月六月激情| 丁香五月激情婷婷激情| 日韩一区二区在线播放| 激情综合婷婷| 五月丁香六月综合基地| 岛国操B不卡在线| 五月丁香狠狠爱婷婷综合| 欧美三9久九观看| 国产69久久久欧美黑人A片| 丁香婷婷色五月| 婷婷五月天黄色| 伊人久久大香蕉网| 久久婷婷亚洲| 夜夜操狠狠操| 玖玖五月丁香| 中文av网站| 激情综合网五月天| 婷婷天天日婷婷| av狠狠操| 日本婷婷| 色五月欧美| 日本美女上人| 丁香大香蕉| 久久98| 夜夜干天天操| 亚洲操操| 最近免费中文字幕大全高清大全1| 五月天综合网| 成人无码精品1区2区3区免费看| 成人精品一区日本无码网 | 天天日天天爽| 久热久| 九九99九九精品免费 | 色婷婷丁香五月| 国产毛多水多女人A片| 色五月激情五月| 九九婷婷热| 狠狠色丁香婷婷五月| 激情九月天天天天婷婷| 超碰97干| 久久99热这里只有精品首| 激情噜噜噜| 九九色色网| 久久天天天| 五月婷庭丁香在线| 五月情涩综合婷婷| 日韩色五月| 九九 激情 网| 五月婷婷AV| 天天做天天爱| 色婷丁香91| 最新AV在线观看| 久久久97| 天天爱天天做综合| 99热99热不卡| 久久99热这里只频精品6学生| 狼人婷婷久久| 色999;丁香五月| aaaa久久| 婷婷久久五月天丁香| 婷婷欧美激情综合| 国产精品久久久丁香五月八戒视频| 婷婷久久亚洲| 激情综合啪啪| 99ER热精品视频| 丁香五月激情综合婷综| 婷婷五月天受日本法律保护| 九九热这里只有精品9| 五月婷婷五月天| 99爱爱| 超碰69天堂| 九月丁香亭亭| 99精品爱| 久久精典| 五月婷婷影视| 一区二区乱码视频| 丁香五月aV| 色色色网站| 国产毛片精品一区二区色欲黄A片| 壅壅儕家a| 丁香五月激情六月欧亚激情综合导航| 青青福利网| 五月婷婷丁香综合| 丁香六月天婷婷色| 亚洲综合99| 丁香 婷婷 亚洲 熟女| 五月综合无码| 99热亚洲综合| 99热国产这里只有| 色五月涩涩婷婷| 精品久久久久成人码免费动漫| 五月婷婷久久久久| 五月丁香在线婷婷蜜桃| AV在线免费网站| 91丨九色丨国产| 丁香五月婷婷六月婷婷| 人人干人人操人人摸| 五月综合视频| 99在线资源| 亚洲天天综合| 国外亚洲成AV人片在线观看| www.99日本| 丁香五月在线观看完整版| 天天干天天干天天干天天干天天干| 五月色丁香婷婷综合| oumeisesewang| 亚洲最大在线| 影音先锋91男人资源在线播放| 日本www五月婷婷| 久久婷婷综| 丁香六月成人网| 日夜夜天天| 婷婷亚洲综合| 久9热在线视频| 天天噜噜| 亚洲成人在线电影网站| 久久成人性爱| 99热这里是精品| 超碰国产av| 六月婷婷开心| 九九九激情网| www.日日夜夜| 天天操夜夜操| 色亚洲无码| 九九综合九九| 玖玖午夜视频| 五月天播播中文字幕| 九九久久腿| av免费人人| www免费在线视频| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 超碰成人av| 一本色道久久综合狠狠躁小说| 日本性视频| 国产精品色一哟哟| 日本熟妇乱妇熟色A片蜜桃| 人人草成人视频| 九九热在线99| 久久久com| www.zbzhongsen.com| 五月色色网| 午夜色婷婷| 婷婷永久在线| 色综合色色| 97人人草| 狠狠色噜噜狠狠狠狠综合| 五月丁香啪啪网| 大香蕉啪啪啪| 深夜男女福利刺激影院一区完整| 九九这里是免费的视频5| 六月丁香中文字幕| 亚洲综合另类| 婷婷人人操| 99热国产精品| 狠狠综合| 天天肏夜夜肏| 婷婷5月天激情综合| 亚洲乱码日产精品BD| VA婷婷亚洲| 一本狠婷婷综合| 欧美日韩成人在线网|