簡體   English   中英

為什么從裸倉庫回購git checkout而不是創建?

[英]Why does git checkout from a bare repo delete instead of creating?

這有點奇怪,如果在我的特定情況下沒有太多應用,我謹此表示歉意。 我正在使用git來管理我的部署程序包,方法是提交並標記一組與部署有關的生成文件以及指向發布代碼的子模塊。 我正在嘗試從每台計算機上的裸倉庫中對該部署標簽進行git checkout到不同的空目錄中。 我得到的輸出表明它已經刪除了應該創建的文件,並且工作樹目錄此后仍然為空。

$ ls -al /var/www/test/
total 0

$ git --bare --work-tree=/var/www/test/ checkout my_tag
D   .gitmodules
D   generated.tgz
D   release
D   signatures.md5
HEAD is now at 8946ff5... Generated contents of deployment package.

$ ls -al /var/www/test/
total 0

我應該聲明my_tag引用的提交和master提示都具有相同的4個文件(盡管內容不同)。 使得以下過程使我有75%的成功率,這使所有人感到陌生:

$ git --bare --work-tree=/var/www/test/ checkout master
D   .gitmodules
Previous HEAD position was 8946ff5... Generated contents of deployment package.
Switched to branch 'master'

$ ls -al /var/www/test/
total 4
-rw-r--r-- 1 root root    0 Oct 17 17:00 generated.tgz
drwxr-xr-x 2 root root 4096 Oct 17 17:00 release
-rw-r--r-- 1 root root    0 Oct 17 17:00 signatures.md5

$ git --bare --work-tree=/var/www/test/ checkout my_tag
D   .gitmodules
(---- git's warning about detached HEAD state cut ----)
HEAD is now at 8946ff5... Generated contents of deployment package

$ ls -al /var/www/test/
total 4624
-rw-r--r-- 1 root root 2103765 Oct 17 17:02 generated.tgz
drwxr-xr-x 2 root root    4096 Oct 17 17:00 release
-rw-r--r-- 1 root root 2614883 Oct 17 17:02 signatures.md5

問題是,“發布”是一個git子模塊,如果沒有.gitmodules,我將無法初始化或更新它,因此75%的方式仍然不夠好。

解決此問題的一種方法是,每次部署時都簡單地重新克隆存儲庫,如果沒人能提出更好的解決方案,也許我會采用這種方式。 但理想情況下,我想在每台計算機上保留一個裸倉庫,並每次將其從該倉庫簽到新的工作樹。 有人可以告訴我這是怎么回事嗎?

作為參考,我使用的是Git 1.8.2.1。

基本的問題是checkout正在將所需的修訂版( my_tagmaster )與--bareHEAD中的內容進行比較。 (並且--bare參數不執行任何操作。)因此,使用my_tag ,它表示您已經處於分離的HEAD模式下,並且處於所需的rev上(即,它不應更改HEAD並查找目標目錄/var/www/test/ ,並看到文件已被刪除,並為每個文件提供了D狀態。 假定它們是由於索引而存在的(請參見下文)。

當您切換到checkout master ,它會顯示:確定,您正在從此分離的HEAD移至master ,它將更新HEAD並簽出更改的文件。 但是.gitmodules是在同一my_taghead ,讓一個仍然D eleted。

如果使用checkout -f ,它將假定它應該替換丟失的文件。

Git也有一個壞習慣:-)使用$GIT_DIR/index來記錄它在結帳時的行為,以及$GIT_DIR/HEAD 從要部署的事物中刪除文件時,這會導致文件滯后。 如果在執行checkout -f之前清空了目標目錄,則應該可以。 (或者,在環境中設置GIT_INDEX_FILE ,命名與每個唯一部署一起保存的文件。我沒有對此進行試驗,但是應該可以正常工作。)

暫無
暫無

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

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