簡體   English   中英

Git 從分支簽出文件而不跟蹤它們

[英]Git checkout files from a branch without tracking them

我的問題是:我有一個 git 存儲庫,在 .gitignore 文件中有一個目錄。 通常這是可行的,目錄中更改的任何文件都將被忽略。 但是,如果我從不忽略這些文件的分支將文件檢出到忽略的目錄中,即:

git checkout a_branch /c/IgnoredDirectory 

我發現當我這樣做時,應該忽略的目錄和文件現在被跟蹤了

git status

那么如何從單獨的分支添加文件而不讓 git 跟蹤它們呢? 我的想法是 git 應該忽略我添加的文件,因為它們位於 .gitignore 文件的忽略目錄中。 我在哪里看錯了?

代碼:

我的.gitignore 文件

RecordDataBases/

當我從一個單獨的分支簽出文件並運行 git 狀態時,我得到:

    new file:   RecordDataBases/AstroFiles
    new file:   RecordDataBases/AstroFiles_goodversion
    new file:   RecordDataBases/AstroFiles_old_file
    new file:   RecordDataBases/README.rtf

謝謝

這是正確的: git checkout commit-specifier -- paths將指定路徑從指定的提交復制到索引 (也稱為暫存區域 )。 一旦他們進入索引,他們就會被跟蹤 然后,它使用由任何目錄或glob擴展產生的相同完整路徑將文件從索引復制到工作樹。

因為這在索引中的任何文件定義跟蹤,你的任務是既避免讓他們進入指數擺在首位,或者后來又刪除它們。 后者更容易:

git rm -r --cached RecordDataBases/

例如(但請注意,它將刪除此類文件的所有索引條目,而不僅僅是git checkout步驟創建的索引條目)。 --cached選項告訴git rm 從索引中刪除文件,而不是從工作樹中刪除文件。

您可以,而不是執行上述操作,從而無需先將其復制到索引中,從指定的提交中提取文件。 最簡單的方法是使用git show ,語法為git show commit-specifier : path > path ,例如, git show a_branch:RecordDataBases/AstroFiles > RecordDataBases/AstroFiles 除了需要重復每個路徑名稱之外,還有一些注意事項:

  • 這需要一次做一個文件(沒有簡單的方法來獲得包含子樹的整個目錄樹);
  • 默認情況下,省略任何行尾,標識或塗抹過濾器操作。

但是因為這不會首先將擴展路徑復制到索引中,所以之后不需要從索引中刪除它們。

另一種方法呢:

git checkout commit-specifier RecordDataBases/
mv RecordDataBases/ RecordDataBases.historical/
git reset
#optionally: mv RecordDataBases.historical/ RecordDataBases/

在此 git 狀態之后,RecordDataBases.historical/ 顯示為未跟蹤目錄。 如果 RecordDataBases/ 之前不存在,我將其重命名為相同的行為。

這里會有我看不到的任何(其他)副作用嗎?

暫無
暫無

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

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