精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在 Git 倉庫中,文件究竟被存儲在哪里?

系統
大家好!今天我和一個朋友討論 Git 的工作原理,我們感到奇怪,Git 是如何存儲你的文件的?我們知道它存儲在 .git 目錄中,但具體到 .git 中的哪個位置,各個版本的歷史文件又被存儲在哪里呢?來看一下吧。

以這個博客為例,其文件存儲在一個 Git 倉庫中,其中有一個文件名為 content/post/2019-06-28-brag-doc.markdown。這個文件在我的 .git 文件夾中具體的位置在哪里?過去的文件版本又被存儲在哪里?那么,就讓我們通過編寫一些簡短的 Python 代碼來探尋答案吧。

Git 把文件存儲在 .git/objects 之中

你的倉庫中,每一個文件的歷史版本都被儲存在 .git/objects 中。比如,對于這個博客,.git/objects 包含了 2700 多個文件。

$ find .git/objects/ -type f | wc -l
2761

注意:.git/objects 包含的信息,不僅僅是 “倉庫中每一個文件的所有先前版本”,但我們暫不詳細討論這一內容。

這里是一個簡短的 Python 程序(find-git-object.py),它可以幫助我們定位在 .git/objects 中的特定文件的具體位置。

import hashlib
import sys
def object_path(content):
    header = f"blob {len(content)}\0"
    data = header.encode() + content
    sha1 = hashlib.sha1()
    sha1.update(data)
    digest = sha1.hexdigest()
    return f".git/objects/{digest[:2]}/{digest[2:]}"
with open(sys.argv[1], "rb") as f:
    print(object_path(f.read()))

此程序的主要操作如下:

  • 讀取文件內容
  • 計算一個頭部(blob 16673\0),并將其與文件內容合并
  • 計算出文件的 sha1 校驗和(此處為 e33121a9af82dd99d6d706d037204251d41d54
  • 將這個 sha1 校驗和轉換為路徑(如 .git/objects/e3/3121a9af82dd99d6d706d037204251d41d54

運行的方法如下:

$ python3 find-git-object.py content/post/2019-06-28-brag-doc.markdown
.git/objects/8a/e33121a9af82dd99d6d706d037204251d41d54

術語解釋:“內容尋址存儲”

這種存儲策略的術語為“內容尋址存儲content addressed storage”,它指的是對象在數據庫中的文件名與文件內容的哈希值相同。

內容尋址存儲的有趣之處就是,假設我有兩份或許多份內容完全相同的文件,在 Git 的數據庫中,并不會因此占用額外空間。如果內容的哈希值是 aabbbbbbbbbbbbbbbbbbbbbbbbb,它們都會被存儲在 .git/objects/aa/bbbbbbbbbbbbbbbbbbbbb 中。

這些對象是如何進行編碼的?

如果我嘗試在 .git/objects 目錄下查看這個文件,顯示的內容似乎有一些奇怪:

$ cat .git/objects/8a/e33121a9af82dd99d6d706d037204251d41d54
x^A<8D><9B>}s<E3>?<C6><EF>o|<8A>^Q<9D><EC>ju<92><E8><DD><9C><9C>*<89>j<FD>^...

這是怎么回事呢?讓我們來運行 file 命令檢查一下:

$ file .git/objects/8a/e33121a9af82dd99d6d706d037204251d41d54
.git/objects/8a/e33121a9af82dd99d6d706d037204251d41d54: zlib compressed data

原來,它是壓縮的!我們可以編寫一個小巧的 Python 程序—— decompress.py,然后用 zlib 模塊去解壓這些數據:

import zlib
import sys
with open(sys.argv[1], "rb") as f:
    content = f.read()
    print(zlib.decompress(content).decode())

讓我們來解壓一下看看結果:

$ python3 decompress.py .git/objects/8a/e33121a9af82dd99d6d706d037204251d41d54
blob 16673---
title: "Get your work recognized: write a brag document"
date: 2019-06-28T18:46:02Z
url: /blog/brag-documents/
categories: []
---
... the entire blog post ...

結果顯示,這些數據的編碼方式非常簡單:首先有 blob 16673\0 標識,其后就是文件的全部內容。

這里并沒有差異性數據(diff)

這里有一件我第一次知道時讓我感到驚訝的事:這里并沒有任何差異性數據!那個文件是該篇博客文章的第 9 個版本,但 Git 在 .git/objects 目錄中存儲的版本是完整文件內容,而并非與前一版本的差異。

盡管 Git 實際上有時候會以差異性數據存儲文件(例如,當你運行 git gc 時,為了提升效率,它可能會將多個不同的文件封裝成 “打包文件”),但在我個人經驗中,我從未需要關注這個細節,所以我們不在此深入討論。然而,關于這種格式如何工作,Aditya Mukerjee 有篇優秀的文章 《拆解 Git 的打包文件》。

博客文章的舊版本在哪?

你可能會好奇:如果在我修復了一些錯別字之前,這篇博文已經存在了 8 個版本,那它們在 .git/objects 目錄中的位置是哪里?我們如何找到它們呢?

首先,我們來使用 git log 命令來查找改動過這個文件的每一個提交:

$ git log --oneline  content/post/2019-06-28-brag-doc.markdown
c6d4db2d
423cd76a
7e91d7d0
f105905a
b6d23643
998a46dd
67a26b04
d9999f17
026c0f52
72442b67

然后,我們選擇一個之前的提交,比如 026c0f52。提交也被存儲在 .git/objects 中,我們可以嘗試在那里找到它。但是失敗了!因為 ls .git/objects/02/6c* 沒有顯示任何內容!如果有人告訴你,“我們知道有時 Git 會打包對象來節省空間,我們并不需過多關心它”,但現在,我們需要去面對這個問題了。

那就讓我們去解決它吧。

讓我們開始解包一些對象

現在我們需要從打包文件中解包出一些對象。我在 Stack Overflow 上查找了一下,看起來我們可以這樣進行操作:

$ mv .git/objects/pack/pack-adeb3c14576443e593a3161e7e1b202faba73f54.pack .
$ git unpack-objects < pack-adeb3c14576443e593a3161e7e1b202faba73f54.pack

這種直接對庫進行手術式的做法讓人有些緊張,但如果我誤操作了,我還可以從 Github 上重新克隆這個庫,所以我并不太擔心。

解包所有的對象文件后,我們得到了更多的對象:大約有 20000 個,而不是原來的大約 2700 個。看起來很酷。

find .git/objects/ -type f | wc -l
20138

我們回頭再看看提交

現在我們可以繼續看看我們的提交 026c0f52。我們之前說過 .git/objects 中并不都是文件,其中一部分是提交!為了弄清楚我們的舊文章 content/post/2019-06-28-brag-doc.markdown 是在哪里被保存的,我們需要深入查看這個提交。

首先,我們需要在 .git/objects 中查看這個提交。

查看提交的第一步:找到提交

經過解包后,我們現在可以在 .git/objects/02/6c0f5208c5ea10608afc9252c4a56c1ac1d7e4 中找到提交 026c0f52,我們可以用下面的方法去查看它:

$ python3 decompress.py .git/objects/02/6c0f5208c5ea10608afc9252c4a56c1ac1d7e4
commit 211tree 01832a9109ab738dac78ee4e95024c74b9b71c27
parent 72442b67590ae1fcbfe05883a351d822454e3826
author Julia Evans <julia@jvns.ca> 1561998673 -0400
committer Julia Evans <julia@jvns.ca> 1561998673 -0400
brag doc

我們也可以用 git cat-file -p 026c0f52 命令來獲取相同的信息,這個命令能起到相同的作用,但是它在格式化數據時做得更好一些。(-p 選項意味著它能夠以更友好的方式進行格式化)

查看提交的第二步:找到樹

這個提交包含一個。樹是什么呢?讓我們看一下。樹的 ID 是 01832a9109ab738dac78ee4e95024c74b9b71c27,我們可以使用先前的 decompress.py 腳本查看這個 Git 對象,盡管我不得不移除 .decode() 才能避免腳本崩潰。

$ python3 decompress.py .git/objects/01/832a9109ab738dac78ee4e95024c74b9b71c27

這個輸出的格式有些難以閱讀。主要的問題在于,該提交的哈希(\xc3\xf7$8\x9b\x8dO\x19/\x18\xb7}|\xc7\xce\x8e…)是原始字節,而沒有進行十六進制的編碼,因此我們看到 \xc3\xf7$8\x9b\x8d 而非 c3f76024389b8d。我打算切換至 git cat-file -p 命令,它能以更友好的方式顯示數據,我不想自己編寫一個解析器。

$ git cat-file -p 01832a9109ab738dac78ee4e95024c74b9b71c27
100644 blob c3f76024389b8d4f192f18b77d7cc7ce8e3a68ad	.gitignore
100644 blob 7ebaecb311a05e1ca9a43f1eb90f1c6647960bc1	README.md
100644 blob 0f21dc9bf1a73afc89634bac586271384e24b2c9	Rakefile
100644 blob 00b9d54abd71119737d33ee5d29d81ebdcea5a37	config.yaml
040000 tree 61ad34108a327a163cdd66fa1a86342dcef4518e	content <-- 這是我們接下來的目標
040000 tree 6d8543e9eeba67748ded7b5f88b781016200db6f	layouts
100644 blob 22a321a88157293c81e4ddcfef4844c6c698c26f	mystery.rb
040000 tree 8157dc84a37fca4cb13e1257f37a7dd35cfe391e	scripts
040000 tree 84fe9c4cb9cef83e78e90a7fbf33a9a799d7be60	static
040000 tree 34fd3aa2625ba784bced4a95db6154806ae1d9ee	themes

這是我在這次提交時庫的根目錄中所有的文件。看起來我曾經不小心提交了一個名為 mystery.rb 的文件,后來我刪除了它。

我們的文件在 content 目錄中,接下來讓我們看看那個樹:61ad34108a327a163cdd66fa1a86342dcef4518e

查看提交的第三步:又一棵樹

$ git cat-file -p 61ad34108a327a163cdd66fa1a86342dcef4518e
040000 tree 1168078878f9d500ea4e7462a9cd29cbdf4f9a56    about
100644 blob e06d03f28d58982a5b8282a61c4d3cd5ca793005    newsletter.markdown
040000 tree 1f94b8103ca9b6714614614ed79254feb1d9676c    post <-- 我們接下來的目標!
100644 blob 2d7d22581e64ef9077455d834d18c209a8f05302    profiler-project.markdown
040000 tree 06bd3cee1ed46cf403d9d5a201232af5697527bb    projects
040000 tree 65e9357973f0cc60bedaa511489a9c2eeab73c29    talks
040000 tree 8a9d561d536b955209def58f5255fc7fe9523efd    zines

還未結束……

查看提交的第四步:更多的樹……

我們要尋找的文件位于 post/ 目錄,因此我們需要進一步探索:

$ git cat-file -p 1f94b8103ca9b6714614614ed79254feb1d9676c
.... 省略了大量行 ...
100644 blob 170da7b0e607c4fd6fb4e921d76307397ab89c1e    2019-02-17-organizing-this-blog-into-categories.markdown
100644 blob 7d4f27e9804e3dc80ab3a3912b4f1c890c4d2432    2019-03-15-new-zine--bite-size-networking-.markdown
100644 blob 0d1b9fbc7896e47da6166e9386347f9ff58856aa    2019-03-26-what-are-monoidal-categories.markdown
100644 blob d6949755c3dadbc6fcbdd20cc0d919809d754e56    2019-06-23-a-few-debugging-resources.markdown
100644 blob 3105bdd067f7db16436d2ea85463755c8a772046    2019-06-28-brag-doc.markdown <-- 我們找到了!!!

在此,2019-06-28-brag-doc.markdown 之所以位于列表最后,是因為在發布時它是最新的博文。

查看提交的第五步:我們終于找到它!

經過努力,我們找到了博文歷史版本所在的對象文件!太棒了!它的哈希值是 3105bdd067f7db16436d2ea85463755c8a772046,因此它位于 git/objects/31/05bdd067f7db16436d2ea85463755c8a772046

我們可以使用 decompress.py 來查看它:

$ python3 decompress.py .git/objects/31/05bdd067f7db16436d2ea85463755c8a772046 | head
blob 15924---
title: "Get your work recognized: write a brag document"
date: 2019-06-28T18:46:02Z
url: /blog/brag-documents/
categories: []
---
... 文件的剩余部分在此 ...

這就是博文的舊版本!如果我執行命令 git checkout 026c0f52 content/post/2019-06-28-brag-doc.markdown 或者 git restore --source 026c0f52 content/post/2019-06-28-brag-doc.markdown,我就會獲取到這個版本。

這樣遍歷樹就是 git log 的運行機制

我們剛剛經歷的整個過程(找到提交、逐層遍歷目錄樹、搜索所需文件名)看似繁瑣,但實際上當我們執行 git log content/post/2019-06-28-brag-doc.markdown 時,背后就是這樣在運行。它需要逐個檢查你歷史記錄中的每一個提交,在每個提交中核查 content/post/2019-06-28-brag-doc.markdown 的版本(例如在這個案例中為 3105bdd067f7db16436d2ea85463755c8a772046),并查看它是否自上一提交以來有所改變。

這就是為什么有時 git log FILENAME 會執行的有些緩慢 —— 我的這個倉庫中有 3000 個提交,它需要對每個提交做大量的工作,來判斷該文件是否在該提交中發生過變化。

我有多少個歷史版本的文件?

目前,我在我的博客倉庫中跟蹤了 1530 個文件:

$ git ls-files | wc -l
1530

但歷史文件有多少呢?我們可以列出 .git/objects 中所有的內容,看看有多少對象文件:

$ find .git/objects/ -type f | grep -v pack | awk -F/ '{print $3 $4}' | wc -l
20135

但并不是所有這些都代表過去版本的文件 —— 正如我們之前所見,許多都是提交和目錄樹。不過,我們可以編寫一個小小的 Python 腳本 find-blobs.py,遍歷所有對象并檢查是否以 blob 開頭:

import zlib
import sys
for line in sys.stdin:
    line = line.strip()
    filename = f".git/objects/{line[0:2]}/{line[2:]}"
    with open(filename, "rb") as f:
        contents = zlib.decompress(f.read())
        if contents.startswith(b"blob"):
            print(line)
$ find .git/objects/ -type f | grep -v pack | awk -F/ '{print $3 $4}' | python3 find-blobs.py | wc -l
6713

于是,看起來在我的 Git 倉庫中存放的舊文件版本有 6713 - 1530 = 5183 個,Git 會為我保存這些文件,以備我想著要恢復它們時使用。太好了!

就這些啦!

在 這個 gist 中附上了全部的此篇文章所用代碼,其實沒多少。

我以為我已經對 Git 的工作方式了如指掌,但我以前從未真正涉及過打包文件,所以這次探索很有趣。我也很少思考當我讓 git log 跟蹤一個文件的歷史時,它實際上有多大的工作量,因此也很開心能深入研究這個。

作為一個有趣的后續:我提交這篇博文后,Git 就警告我倉庫中的對象太多(我猜 20,000 太多了!),并運行 git gc 將它們全部壓縮成打包文件。所以現在我的 .git/objects 目錄已經被壓縮得十分小了:

$ find .git/objects/ -type f | wc -l
14

(題圖:MJ/319a396c-6f3f-4891-b051-261312c8ea9a)

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2011-06-27 10:07:39

2020-11-03 06:55:41

系統版本64位

2010-03-19 09:40:44

Cisco交換機

2022-11-26 00:00:07

內存數組程序

2023-04-04 08:38:27

命令Git倉庫

2019-12-05 09:13:18

通信

2018-01-17 10:01:38

程序員高手菜鳥

2021-03-11 14:13:10

人工智能算法工程師

2021-09-18 10:51:09

分布式存儲

2024-02-21 17:05:51

字節Sora視頻

2024-01-08 08:59:40

傳統企業數字化癥結

2019-10-17 09:41:24

量子計算機芯片超算

2015-10-09 09:55:22

中印大戰科技界

2011-07-14 13:10:44

負載均衡Nginx

2021-10-28 22:31:11

存儲云存儲數據

2009-06-23 09:07:38

2021-07-01 08:31:25

數字化轉型大數據數據采集

2019-06-19 08:59:52

數據庫死鎖堆棧

2022-02-25 08:08:13

固態硬盤機械硬盤

2011-12-28 10:24:49

Windows Pho
點贊
收藏

51CTO技術棧公眾號

欧美亚洲日本在线观看| 91精品国产综合久久香蕉922| 无码人妻精品一区二区三| 都市激情久久综合| 久久久五月婷婷| 日韩av电影中文字幕| 国产又色又爽又高潮免费| 青草伊人久久| 一本色道久久综合亚洲91| 亚洲一区二区三区精品动漫| 精品人妻久久久久一区二区三区 | 国产主播一区二区| 亚洲精品一区二区三区不| 亚洲精品视频一二三| 国产成年妇视频| 五月久久久综合一区二区小说| 日韩亚洲欧美在线| 精品一区二区中文字幕| 国产在线二区| 久久久久国产免费免费 | 苍井空浴缸大战猛男120分钟| 日本电影全部在线观看网站视频 | 欧美黄色一级生活片| 国产欧美88| 日本道色综合久久| 野外做受又硬又粗又大视频√| 大乳在线免费观看| 成人的网站免费观看| 久久亚洲欧美日韩精品专区| 亚洲观看黄色网| 久久在线观看| 欧美日韩免费不卡视频一区二区三区| 国产精品又粗又长| 主播国产精品| 中文字幕中文在线不卡住| 久久精品国产99精品国产亚洲性色| 97精品人妻一区二区三区在线| 午夜亚洲福利在线老司机| 欧美美女18p| 久久久久久久久福利| 天天做夜夜做人人爱精品 | 亚洲欧洲美洲一区二区三区| 一区三区二区视频| 国产精品无码一区二区三| 韩国三级大全久久网站| 欧美日韩在线三级| 粉嫩虎白女毛片人体| 亚洲精品日产| 精品美女国产在线| 精品视频在线观看一区| 欧美人与牲禽动交com| 国产成人在线视频网站| 久久99亚洲精品| 日韩精品一区二区亚洲av性色| 精品国产91| 亚洲女人初尝黑人巨大| 97香蕉碰碰人妻国产欧美| 黄色成人美女网站| 欧美小视频在线| 亚洲人精品午夜射精日韩| 少女频道在线观看免费播放电视剧| 中文字幕中文在线不卡住| 亚洲三区四区| 国产原创精品视频| 亚洲免费在线视频| 麻豆映画在线观看| 蜜臀av在线| 午夜成人免费视频| 每日在线更新av| 国模冰冰炮一区二区| 色综合激情久久| aa免费在线观看| 日韩视频网站在线观看| 日本韩国欧美一区二区三区| 日韩视频在线免费看| 国产精品一区二区日韩| 欧美日韩在线视频观看| 青青青在线视频免费观看| 四季久久免费一区二区三区四区| 亚洲激情图片qvod| 免费超爽大片黄| 一区二区电影免费观看| 欧美色网一区二区| 被黑人猛躁10次高潮视频| 国产亚洲高清一区| 亚洲第一av网站| 深爱五月激情网| 日韩欧美1区| 欧美第一页在线| 99热6这里只有精品| 亚洲成av人片乱码色午夜| 欧美大片va欧美在线播放| 欧美大波大乳巨大乳| 99久久激情| 午夜精品久久久久久久久久久久久| 日韩国产第一页| 亚洲欧美日韩动漫| 日本一卡二卡四卡精品| 免费观看成人鲁鲁鲁鲁鲁视频| 国产日产欧美精品| 丰满人妻熟女aⅴ一区| 久久亚洲精精品中文字幕早川悠里 | 日韩精品一区二区不卡| 日本人妖一区二区| 国产传媒一区二区三区| 欧美一区二区三区网站| 久久精品国产一区二区| 国产精品视频福利| 97视频在线观看网站| 亚洲成人免费在线| 亚洲国产高清av| 大桥未久女教师av一区二区| 中文字幕亚洲欧美日韩2019| 久久久久久久久久久久久久久| 亚洲高清资源在线观看| 日本免费久久高清视频| 国产jzjzjz丝袜老师水多| 久久久99精品久久| 日本精品久久久久久久久久| 亚洲免费看片| 亚洲品质视频自拍网| 久久老司机精品视频| 美国av一区二区| 久久国产精品-国产精品| 黄色动漫在线| 欧美在线视频全部完| 最新在线黄色网址| 午夜激情一区| 成人激情视频免费在线| 黄色在线视频观看网站| 精品成人av一区| av在线免费观看不卡| 91视频综合| 国产精品视频色| 亚洲图片小说视频| 极品少妇一区二区三区精品视频| 久久久久久久久久久久久久久久av | 中文字幕一区2区3区| 91影院在线免费观看| 久久精品国产综合精品| 在线观看的网站你懂的| 欧美日韩久久久一区| 亚洲久久久久久久| 午夜在线a亚洲v天堂网2018| 国产综合18久久久久久| 欧美xxx黑人xxx水蜜桃| 91精品在线免费观看| 久久成人小视频| 蜜桃久久av一区| 亚洲成人精品电影在线观看| 自拍偷自拍亚洲精品被多人伦好爽| 日韩精品高清在线观看| 在线观看亚洲大片短视频| 亚洲欧美日韩专区| 清纯唯美一区二区三区| 精品91久久| 伊人久久精品视频| 色婷婷久久综合中文久久蜜桃av| 久久精品日产第一区二区三区高清版 | 成年人视频免费在线播放| 精品噜噜噜噜久久久久久久久试看| 国产不卡一二三| 国产精品一国产精品| 欧美在线播放视频| 免费一级毛片在线观看| 91久久久免费一区二区| 一级黄色片网址| 蜜臀av性久久久久av蜜臀妖精| 亚洲精品9999| 国产精品久久久久久久久久久久久久久 | 国产ts在线观看| 亚洲国产精品第一区二区三区| 国产专区一区二区| 欧美激情喷水| 色一区av在线| www日本高清视频| 婷婷丁香激情综合| 欧洲av一区二区三区| 久久精品免费看| 男人天堂手机在线视频| 日韩精品免费一区二区三区竹菊 | 国产亚洲成年网址在线观看| 99热这里只有精品在线播放| 四季av在线一区二区三区| 91网免费观看| 亚洲同志男男gay1069网站| 在线观看欧美日韩| 国产熟女一区二区丰满| 欧美日韩国产激情| 日本一二三不卡视频| 国产九九视频一区二区三区| 国产毛片视频网站| 色婷婷色综合| 国产一区二区三区高清| a屁视频一区二区三区四区| 欧美精品一区二区三区视频| 免费在线不卡视频| 国产精品伦理一区二区| 亚洲日本久久久| 青草国产精品久久久久久| 国产欧美123| 伊人久久大香线蕉av不卡| 国产69精品久久久久9999| 伦理片一区二区三区| 欧美白人最猛性xxxxx69交| 国产又大又粗又爽| 一区二区三区鲁丝不卡| 夜夜春很很躁夜夜躁| 成人黄色综合网站| 一区二区在线免费看| 成人羞羞视频播放网站| av一本久道久久波多野结衣| **在线精品| 久久久爽爽爽美女图片| 日韩子在线观看| 亚洲乱码国产乱码精品精| 国产高清免费观看| 欧美性色黄大片| 免费观看一区二区三区毛片| 亚洲精品网站在线观看| 欧美大波大乳巨大乳| 97se亚洲国产综合在线| 韩国三级丰满少妇高潮| 久久66热偷产精品| 91蝌蚪视频在线观看| 亚洲国产片色| 成人在线免费高清视频| 国产精品99久久久久久动医院| 蜜桃传媒视频麻豆一区| swag国产精品一区二区| 91视频九色网站| 四虎国产精品永久在线国在线| 4p变态网欧美系列| 9999热视频在线观看| 欧美精品一二区| a在线免费观看| 久久精品电影网| 成人午夜精品福利免费| 7878成人国产在线观看| 在线观看一二三区| 欧美视频你懂的| av首页在线观看| 欧美午夜精品电影| 不卡av电影在线| 在线国产电影不卡| 无码人妻精品一区二区三区9厂| 黄色成人av网| 天海翼一区二区| 亚洲成av人片在www色猫咪| 精品在线视频观看| 亚洲妇熟xx妇色黄| 日韩精品一区三区| 午夜精品aaa| 中文字幕激情小说| 色婷婷亚洲精品| 波多野结衣不卡| 欧美日韩综合在线免费观看| 中文资源在线播放| 在线电影国产精品| 国产成人精品免费看视频| 日韩精品一区国产麻豆| 人妻va精品va欧美va| 日韩激情片免费| 国产精品久久一区二区三区不卡 | 黄网址在线观看| 色在人av网站天堂精品| av免费不卡国产观看| 欧美性受xxxx黑人猛交| 亚洲一区二区三区四区| 国产伊人精品在线| 日本在线一区二区三区| 国产日韩欧美一区二区三区四区| 蜜桃一区二区三区| 亚洲视频小说| 亚洲精品韩国| 天堂av在线网站| 国产白丝精品91爽爽久久| 人妻换人妻a片爽麻豆| 久久久高清一区二区三区| 五月天免费网站| 亚洲妇女屁股眼交7| 欧美brazzers| 欧美一级理论性理论a| 色视频在线看| 久久久精品中文字幕| 2019中文字幕在线电影免费| 国产91免费看片| 欧美精品三级在线| 欧美精品一区二区三区久久| 国产精品久久久久久久久妇女 | 久久精品一区二区国产| 午夜国产福利在线观看| 国产一区啦啦啦在线观看| www男人天堂| 久久久久久久久久久电影| 91高清免费观看| 亚洲成人中文在线| 91精品国产乱码久久久| 精品噜噜噜噜久久久久久久久试看| 国产黄色片在线播放| 久久精品视频网站| av影院在线| 成人高清视频观看www| xvideos.蜜桃一区二区| 国产精选一区二区| 日韩欧美三级| 韩日视频在线观看| 精品一区二区三区影院在线午夜| jizz欧美性11| 国产资源在线一区| 99久久免费看精品国产一区 | 日韩欧美高清在线| 欧美日韩激情视频一区二区三区| 亚洲系列中文字幕| 波多一区二区| 国产在线精品播放| 久草成人在线| 青青在线视频免费观看| 老鸭窝亚洲一区二区三区| 色哟哟无码精品一区二区三区| 国产欧美一区二区精品性色| 久久丫精品久久丫| 日韩一区二区精品葵司在线| 蜜桃视频在线入口www| 97色在线视频| 精品一区91| 天天综合色天天综合色hd| 亚洲欧美日本日韩| 精品国产乱码久久久久夜深人妻| 日韩美女视频19| www.欧美色| 亚洲精品videossex少妇| 高h视频在线播放| 亚洲自拍偷拍第一页| 天堂99x99es久久精品免费| 97超碰国产精品| 久久99国产精品免费| 成年人免费视频播放| 中文字幕 在线观看| 亚洲欧美综合v| 国产高清中文字幕在线| 91免费精品视频| 一区二区三区午夜视频| 日韩精品免费播放| 99久久国产综合精品麻豆| 黄色激情视频在线观看| 91精品国产美女浴室洗澡无遮挡| 乱人伦中文视频在线| 国产成人精品在线播放| 你懂的视频欧美| 虎白女粉嫩尤物福利视频| av一区二区三区四区| 朝桐光av在线| 精品国产成人系列| 99自拍视频在线观看| 91色精品视频在线| 水蜜桃久久夜色精品一区| 国产一伦一伦一伦| 国产精品不卡在线| 国产又粗又猛又色又| y97精品国产97久久久久久| 国产高清日韩| 欧美 日韩 国产 在线观看| 国产一区二区毛片| 日韩三级在线观看视频| 91精品国产91久久久久久最新毛片| a毛片在线播放| 91久久久一线二线三线品牌| 亚洲网址在线| 国产精品久久久影院| 国产毛片精品国产一区二区三区| 久久午夜无码鲁丝片午夜精品| 精品成人a区在线观看| 欧产日产国产精品视频| 欧美精品国产精品久久久| 久久久成人网| 91高清免费看| 精品久久久久久久久久久久久久久 | 国产无套粉嫩白浆内谢| 欧美xxxx在线观看| 香蕉久久免费电影| 少妇免费毛片久久久久久久久| 精久久久久久| 调教驯服丰满美艳麻麻在线视频| 欧美日韩免费高清一区色橹橹| 超碰caoporn久久| 91久久精品www人人做人人爽| 久久久久国内| 中国1级黄色片| 亚洲精品久久久久| 天堂久久午夜av| 蜜臀精品一区二区| 91麻豆国产香蕉久久精品| 亚洲午夜精品久久久| 欧美精品一区二区免费| 日韩高清成人在线| 日韩欧美中文视频| 天天色图综合网| 在线heyzo| 欧美国产综合视频|