2015-04-01 80 views
2

我知道如果我在裸存儲庫中有文件,我可以使用git show HEAD:path/to/file訪問它們。將東西添加到git裸存儲庫

但是,我可以將新內容添加到裸存儲庫而無需克隆和修改工作樹嗎?

+1

您可以在不使用工作樹的情況下通過使用低級別git命令來構建提交,這是一種非常光榮的方式來完成事情,但很少改進便利命令;你可以在不克隆的情況下做到這一點 - 甚至有很多選擇 - 但是選擇一種合理的方式去實現這一點取決於你想要構建的歷史與已經存在的歷史之間的關係。那麼,您發現自己在什麼情況下會提出這個問題? – jthill

+0

所說的git倉庫的內容是小文件,有一天可能會以百萬計。雖然我知道隨着事情變得越來越大,會出現性能成本,但在服務器上運行的極端情況下擁有數百萬小文件和文件夾的擔憂並不會很好。使用裸倉庫減輕了一些問題,同時調查了替代品 –

+0

因此,單次提交可能包含數百萬個文件,您經常或通常不希望所有文件都立即檢出,是的?好的,這非常有幫助。下一個問題:你試圖通過無克隆要求來避免的怪物結賬,或者是什麼?要更新回購協議,您必須位於同一個文件系統上或推送到該文件系統,剩下的唯一問題就是在何處執行該工作以及提交結構的詳細信息。 – jthill

回答

3

如果我添加1個文件中,只有1個文件是在犯,又名我們增加了一些新的東西,它現在是一成不變的

有便捷的方式可以添加單個文件承諾主分公司的祕訣在裸回購。

所以看來我需要創建一個blob對象,將它附加到樹上,然後將該樹對象附加到提交。

所有提交任何事情的方法歸結爲做到這一點,這只是一個問題,說明便利命令如何適合您的目的。 git add創建一個blob並在索引中爲它創建一個條目; git commit做了一個git write-tree,它爲索引中的內容添加了所有新樹,並添加了頂層生成樹的提交,並且git update-ref保持HEAD爲最新。裸回購確實有一個HEAD提交,通常附加到(也稱爲符號引用)像master這樣的分支。 。 。

因此,git的便捷命令已經在做你想要的東西了。特別是只有一個文件,這將是非常簡單的。

說,例如,您的文件出現在~server/data/logs/,您使用的是分佈在裸露的回購協議是在~server/repo.git,你想提交的文件將在回購data/logs,而你總是要提交的最新日誌文件:

#!/bin/sh 
cd ~server 

# supply locations git ordinarily does on its own in working i.e. non-bare repos: 

export GIT_DIR=$PWD/repo.git     # bare repos don't have defaults for these 
export GIT_WORK_TREE=$PWD      # so supply some to suit our purpose 
export GIT_INDEX_FILE=$GIT_DIR/scratch-index # ... 

# payload: commit (only) the latest file in data/logs: 

git read-tree --empty      # make the index all pretty, and 
git add data/logs/`ls -1t data/logs|sed q` # everything's ordinary from here - add and 
git commit -m'new logfile'     # commit 

git read-tree從承諾樹中加載索引條目。這是結帳和合並和重置的基礎,可能還有一些我忘記atm。在這裏,我們只需要一個空索引,因此--empty

使用推/拉/遠程數據而使用每臺機器上已經可用的工具同步

你說隨着時間的推移文件的「百萬」,如果你不希望完整的歷史分發,rsync因爲我收集你已經懷疑可能是一個更好的選擇。但是 - 一次一個,每分鐘一個新文件,需要兩年才能累計一百萬。那麼,?

無論如何,上述過程可以高效地擴展到每次提交的任何小數目的文件。對於批量工作有更好的方法。

+0

很酷。好的回答:) – Jubobs