2017-07-22 66 views
4

我們可以使用git ls-remote命令來獲取給定git repo的提交列表,例如this discussion'git ls-remote'命令參數限制返回行的數量

此命令花費我們相當長的時間才能找到具有大的提交/標記列表的回購 - 我們正在查找其參數和/或任何其他命令來限制返回的行數,例如只讀取返回列表中的前3行。

我們該怎麼做到這一點?

p.s.

我的google searchour site search沒什麼幫助。

+0

發佈後[我的回答(https://stackoverflow.com/a/45253629/6394138)我想通了,如果你是舒服接收一個不完整的名單,那麼也許你正試圖解決一些你沒有用錯誤的工具告訴我們的問題。你能準確地說出你想要達到的目標嗎? – Leon

+0

一個用例@Leon,我們想盡快得到最新的提交/標記行 –

+0

您是指給定分支*上的*最新提交? – Leon

回答

6

git ls-remote作品fetching the full list of refs from the remote and then filtering it locally

int cmd_ls_remote(int argc, const char **argv, const char *prefix) 
{ 
    ... 

    transport = transport_get(remote, NULL); 
    if (uploadpack != NULL) 
     transport_set_option(transport, TRANS_OPT_UPLOADPACK, uploadpack); 

/* Get all refs from the remote */ 
    ref = transport_get_remote_refs(transport); 
    if (transport_disconnect(transport)) 
     return 1; 

    if (!dest && !quiet) 
     fprintf(stderr, "From %s\n", *remote->url); 

/* Filter the list of all refs */ 
    for (; ref; ref = ref->next) { 
     if (!check_ref_type(ref, flags)) 
      continue; 
     if (!tail_match(pattern, ref->name)) 
      continue; 
     if (show_symref_target && ref->symref) 
      printf("ref: %s\t%s\n", ref->symref, ref->name); 
     printf("%s\t%s\n", oid_to_hex(&ref->old_oid), ref->name); 
     status = 0; /* we found something */ 
    } 
    return status; 
} 

UPDATE

根據this page, explaining git transfer protocols,如果遠程支持啞協議,那麼就可以得到所述遠程refs/heads/branchname文件直接(例如,使用curl)。

啞協議

如果你建立一個存儲庫送達只讀通過HTTP,啞協議很可能會怎樣使用。該協議被稱爲「啞」,因爲它在傳輸過程中不需要服務器端的特定於Git的代碼;獲取過程是一系列HTTP GET請求,客戶端可以在服務器上假設Git存儲庫的佈局。

...

否則,利用智能協議時,從遠程發送的第一個數據段是總是所有遠程引用的經由連接到遠程列表中,即,任何GIT中命令智能協議就好像git ls-remote在內部運行一樣(技術上講,所有這些命令都會調用transport_get_remote_refs()函數)。在這種情況下,不幸的是,無法加快查詢速度,甚至無法解決問題。

智能協議

...

上傳數據

要上傳數據到一個遠程過程,GIT中使用send-packreceive-pack過程。 send-pack進程在客戶端上運行並連接到遠程端的receive-pack進程。

...

git-receive-pack命令立即用一個線 它目前擁有每個參考響應。

...

下載數據

當你下載數據時,fetch-packupload-pack過程 參與。客戶端啓動fetch-pack進程, 連接到遠程端的upload-pack進程以協商 什麼數據將向下傳輸。

...

fetch-pack相連,upload-pack發回像 這樣的:...... 這非常類似於receive-pack與迴應,但 的能力是不同即列表所有參考文獻+一些 附加數據)。

...