2015-06-23 19 views
0

比方說,我有一個大的Git存儲庫存儲在服務器上,因此多人可以使用它。有沒有辦法推送到遠程Git存儲庫而無需獲取其對象?

我希望能夠使用此存儲庫中的單個文件,即讀取,編輯或插入新文件,而無需獲取其所有內容,因爲它是一個相當大的存儲庫。

我知道,我可以從一個特定的分支獲取文件/使用archive命令和解壓的結果,這樣的承諾:

git archive --remote=git:<URL> <tree-ish> <file_name> | tar -x 

怎麼樣的其他方式?有沒有一種方法可以編輯,插入或刪除給定分支中的新文件,甚至可以將新分支推送到遠程Git存儲庫而無需下載其所有內容?

回答

3

據我所知,沒有辦法做到你想要的。 當您嘗試推一些承諾到遠程倉庫Git會檢測您當前分支是否是其遠程對應後面​​而且這種情況下,它會提示錯誤:

! [rejected]  master -> master (non-fast-forward) 

作爲示例考慮以下情形:

A - B - C - D (remote master) 
    \ 
     - E  (local master) 

如果試圖在此情況下,推Git會阻止你和建議:

Updates were rejected because the tip of your current branch is behind its remote counterpart. Merge the remote changes (e.g. 'git pull') before pushing again.

也就是說,你必須獲取雷莫te分支,合併更改,然後推送合併結果。 Git阻止您推送可能與遠程分支衝突的更改,並要求您在推送之前在本地合併更改(並可能解決衝突)。

作爲一個便箋,你可以在Git中推動非快進的變化(也就是避免獲取遠程)git push --force。儘可能避免強制推送,因爲它可能會帶來一些不愉快的後果,因爲無法訪問某些可能已經拉出的提交。 在以前的方案迫使一推將導致:

A - B - E (remote/local master) 

正如你可以看到這會造成一些麻煩的是拉到偏僻以前的狀態的人。 有關git push --force的後果的詳細說明,請參閱this堆棧溢出問題。

你也可以在Git中做什麼是獲取一個遠程並只檢出一些文件。你可以做到這一點:

git fetch 
git checkout FETCH_HEAD -- <file-path> 

然而,這並不解決您的問題,因爲它仍然獲取遠程並且不允許你推不合並。

+1

這是一個非常清晰,結構良好的答案。非常感謝你! –

相關問題