Git系列 --- git-dir & work-tree

使用git的時候,通常的用法是 cd 到 repository目錄下進行相關的操作,比如說有這麼一個repository, D:\pygit2(通過 git clone https://github.com/libgit2/pygit2.git)
通常的做法是 cd D:\pygit2,然後再執行git的相關指令,比如 git status, git log 等等,這種情況下,git命令默認的是 .gitr和working-tree在同一個目錄下
其實還有一種做法,在執行git命令的時候顯式指定git-dir(.git目錄)和working-tree,這就是本節要講述的 --git-dir 和 --work-tree 參數
如果想將pygit2 repository中的某些commit copy到D:\pygit2以外的目錄中,該怎麼辦?當然通過git clone 再創建一個repository可以做到,但是否是最簡潔的方式?而且git clone存在其他一些不必要的開銷,在某些情況下(比如含有大量的commit,branch)或許不是很合適。此時可以考慮使用git checkout 或者 git reset命令來實現,只需顯式指定working-tree即可。具體實現方法如下:
  假定想將D:\pygit2中的master copy到D:\bak中
  方法一、
    1.1 git --git-dir=D:\\pygit2\\.git --work-tree=D:\\bak status 
      此時可以看到很多提示信息,意思是D:\\bak和D:\pygit2 repository相比很多文件缺失
    1.2 git --git-dir=D:\\pygit2\\.git --work-tree=D:\\bak checkout -b tmp -f master
      使用-f強制checkout,並創建一個tmp的branch
    1.3 git --git-dir=D:\\pygit2\\.git --work-tree=D:\\bak  branch -d tmp
      刪除tmp branch
    1.4 此時可以看到D:\\bak中的內容已經被更新爲D:\\pygit2\\.git master branch的內容
  方法二、
    2.1 git --git-dir=D:\\pygit2\\.git --work-tree=D:\\bak reset --quiet --hard
    2.2 此時可以看到D:\\bak中的內容已經被更新爲D:\\pygit2\\.git master branch的內容,不過這種方法存在一定的弊端,那就是index中的內容都已經丟失,想要恢復
      的話存在一定的難度,所以在使用reset之前還是慎重一些比較好。

需要注意的是, git-dir傳入的一定是git的repository,也就是.git文件夾。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章