[英]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.