2010-07-26 51 views
184

場景:Git:如何更新/簽出遠程原始主文件中的單個文件?

  1. 我做在一個文件中的一些變化在本地並運行git addgit commitgit push
  2. 文件推送到遠程起源主存儲庫
  3. 我還有一個本地資源庫是通過Capistrano通過遠程存儲庫中的「remote_cache」方法部署
  4. 現在我不想部署整個應用程序,只需更新/檢出單個文件即可。

請問,這是不是有可能與Git?我無法找到任何可行的工作,也無法找出答案。有了SVN,我只是做了svn up file和瞧。

我會很高興的任何幫助,謝謝!

+13

您可能需要考慮將接受的答案更改爲實際回答您問題的答案。 ;) – steps 2014-10-27 16:52:13

+4

經過6年多的時間,我相信我們可以有把握地認爲這不會發生@steps ... – 2017-03-05 23:21:16

+3

這必須是最低分的接受答案。 – 2017-04-10 19:35:13

回答

-63

Git不適用於單個文件。我不知道remote_cache設置,所以我不能對此發表評論。但是,在git中,您必須對整個存儲庫執行clone,對文件進行更改,將其提交(這是本地操作),然後再將更改推回。

在您的設置中,您應該能夠簡單地將主資源庫(稱爲M)的變化pull更改爲您的Capistrano部署的回購庫(稱爲B)。我不明白你爲什麼會遇到問題。如果B完全不同並且您不想搞亂它,您可以將M作爲remote添加到B,然後將cherry-pick您感興趣的特定提交(即您正在討論的文件的更新)添加到B.這對你有用嗎?

+1

謝謝!好吧,我對整個特定的提交併不感興趣,我只想將單個文件更新到它的HEAD修訂版本(即使整個提交包含的不僅僅是這個單個文件)在遠程原始主分支中。我想我只是用svn的想法誤解git。我將不得不多做一點試驗。 – foresth 2010-07-27 11:40:05

+0

Git維護文件系統(存儲庫)的快照而不是單個文件歷史記錄,因此您的導航只能位於這些快照之間。參看http://progit.org/book/ch1-3.html – 2010-07-27 17:07:19

+5

我發現@ qzio的回答對我的類似情況非常有幫助;它有零票,但爲什麼呢? - 可能是一種不好的做法或什麼? – lfborjas 2011-01-19 01:16:39

6

你可以做的是:

  1. 更新本地的git回購:

    git fetch

  2. 建立一個本地分支,結賬就可以了:

    git branch pouet && git checkout pouet

  3. 申請你想在這個分支的提交:

    git cherry-pick abcdefabcdef

    (abcdefabcdef是的SHA1提交要應用)

+4

順便說一句,你的第二步也可以通過'git checkout -b pouet'在一個命令中完成。 – 2010-07-26 20:29:54

+2

'pouet'是本例最好的分支名稱。 – Hussard 2016-12-30 15:24:24

589

這是可以做到(在部署存儲庫)

git fetch 
git checkout origin/master -- path/to/file 

獲取將下載所有最近的更改,但不會將其放入當前檢出的代碼(工作區)中。

結帳將更新與下載的更改(origin/master)中的特定文件的工作樹。

至少這對我這些小小的打字錯誤修復,它感到奇怪創建一個分支等只是爲了更改文件中的一個單詞。

+4

然後接下來的代碼會發生什麼? – 2012-04-02 17:51:46

+0

超級方便,這很好。我需要獲取composer.json文件並在更新生產中的其餘網站之前運行更新。如果我手動將composer.json/lock文件放在適當的位置,那麼當我執行pull操作時,會發生衝突說文件已經存在。通過這樣做,git可以毫無怨言地識別這些文件。 – David 2014-01-27 05:45:10

+4

這是我正在尋找的答案。在這個命令中使用 – javadba 2014-08-01 22:08:26

1

或者你正在使用的分支上有git stash(如果你有更改),checkout master,拉取最新的更改,將該文件抓到桌面(或整個應用程序)。檢查你所在的分支。 Git存儲會回到您所在的狀態,然後手動修改這些更改或將其拖到替換文件。

這種方式不是很酷,但它確實有效,如果你們不能找出其他東西。

13
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip 
+0

這應該是公認的答案! – 2017-08-16 09:46:19

+0

這是一個很好的解決方案,用於通過SSH複製repos,但似乎不支持通過https: 'git archive --remote = https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x' 給我錯誤信息:'致命的:操作不支持協議。' – Alderath 2018-03-06 10:18:13

-1

我想我已經找到了一個容易的黑客了。

刪除您對本地存儲庫中的文件(你想從最新的更新文件中的遠程服務器提交)

然後做一個git pull

由於文件被刪除,有將不會產生衝突

+0

這將刪除所有在本地對該文件所做的最終更改,並且還將所有其他文件,這是特別是OP沒有想做。 – legrojan 2017-11-17 11:30:11

相關問題