簡體   English   中英

獲取裸存儲庫的工作副本

[英]Getting a working copy of a bare repository

我有一台服務器,上面有一個用於推送的裸存儲庫。 但是,我的服務器需要有一個 master 分支的工作副本。

如何獲取工作副本並且僅從裸存儲庫獲取?

您可以簡單地將存儲庫克隆到同一台機器上的另一個目錄:

git clone /bare/repo/dir

當前目錄將成為您的 repo 的非裸克隆,您將自動獲得master分支的檢出。 然后使用像git pull這樣的常用命令根據需要更新它。

附帶的好處是,這個操作非常有效——如果你為git clone指定一個本地目錄,git 將使用硬鏈接來共享兩個 repos 的對象數據庫的只讀部分。

裸倉庫只是工作目錄的 .git 目錄,以及本地配置文件中的一個條目。 將裸存儲庫轉換為完整存儲庫的操作是:

  • 創建一個新的子目錄.git並將裸存儲庫中的所有文件移動到那里
  • 編輯.git/config文件,將bare = true更改為bare = false
  • 查看您想要的分支。 這會將存儲庫中的所有文件提取到工作目錄中。

您可以在 Windows 上的.git目錄上設置 Hidden 屬性,但不能在目錄內的文件上設置。

我一直在尋找的“沾邊的工作樹”的方法(如看到這里):

git init --bare

git config core.bare false
git config core.worktree /somewhere/else/

git checkout -f

這對我有用:

git --git-dir=path-to-bare-repo.git --work-tree=path-to-target checkout master .

此命令會將存儲庫中的所有文件提取到path-to-target指定的目錄中

這是對其他 2 個答案的即興演奏,但它填補了我的用例的空白——它適用於從源更新 repo 並檢查分支和任何 git 操作,因為你最終會得到一個正常的完整 git repo。

git clone /path/to/bare/repo /new/path/to/full/repo
cd /new/path/to/full/repo
git remote set-url origin git@github.com:swift/swift.git

執行這 3 行代碼后,您可以git pullgit branch以及git checkout some_branch等等,因為您現在有一個正常的完整 git repo 連接到您的遠程 repo。

這是它的工作原理:

$ git init --separate-git-dir /path/to/existing-bare-repository /path/to/workdir
$ cd /path/to/workdir
$ git checkout .

瞧!

有關信息: git init將報告: Reinitialized existing Git repository in /path/to/existing-bare-repository 但要自信。 man git-init說:在現有存儲庫中運行 git init 是安全的。 它不會覆蓋已經存在的東西。

神奇的是,單獨的git init不會使您的文件出現在工作目錄中。 您必須簽出根目錄。

您可以為此使用“git show”。

http://www.kernel.org/pub/software/scm/git/docs/git-show.html

基本上:

git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file.txt

還可以考慮使用

https://git-scm.com/docs/git-worktree

它應該允許從裸倉庫創建本地工作副本而無需克隆它(如果倉庫很大,這可以節省空間)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM