簡體   English   中英

Git忽略被跟蹤的文件而不刪除它們

[英]Git ignore files being tracked WITHOUT DELETING THEM

我在理解基本的git概念時遇到了一些麻煩:/

在我的git控制的網站上嘗試一些東西之前,我正在我的本地Windows機器上進行測試。

我有:

gittesting/repo1:
    file.txt
    ignoreme:
        ignore.txt

gittesting/repo2
    file.txt
    ignoreme:
        ignore.txt

Repo2是repo1的副本,並且已經跟蹤了ignoreme。 ignore.txt文件在repo2中被更改,但我想停止跟蹤它並讓git完全忽略它。 問題是,如果我創建一個.gitignore文件並添加ignoreme,它已經太晚了,因為它已經被跟蹤了,所以我不得不做git rm --cached ignore,但是它被標記為已刪除,如果我將提交刪除repo1,該目錄將被刪除而不是被單獨留下..

把它們加起來:

  1. ignore.txt在兩個repos之間有不同的內容。
  2. 我希望ignore.txt內容保持原樣並被git完全忽略

我在網上看過,在IRC問過,並查看了相關的問題,但找不到辦法做到這一點。 我知道這個例子似乎微不足道,但這正是我需要在我的網站上做的事情,目錄是論壇/緩存。


編輯:

這有點像黑客,我更喜歡更好的答案,但我最終做了:

cd repo2
echo "ignoreme" > .gitignore
echo "ignoreme/*" > .gitignore
git rm --cache -r ignoreme
git commit -m "Should ignore now"
cd ../repo1
mv ignoreme ignoreme2
git pull ../repo2
mv ignoreme2 ignoreme

試試這個

git update-index --assume-unchanged ignoreme/ignore.txt

如果不更改存儲庫,Git將忽略此文件的任何未來更改。 要再次開始跟蹤更改,請使用

git update-index --no-assume-unchanged ignoreme/ignore.txt

請注意,這僅對當前工作副本生效,因此每次克隆存儲庫時都需要執行此操作。

如果我正確理解你的問題,你希望repo2知道ignoreme/目錄,但是你不希望Git關心對目錄的任何修改。 並且git rm --cached不會幫助你,因為你告訴Git 從現在開始停止跟蹤這些內容。

Git用於跟蹤內容但通過子模塊修復的解決方案。 除了Git Book之外,這個解釋了(重點補充):

盡管rack是工作目錄中的子目錄,但Git將其視為子模塊, 並且當您不在該目錄中時不會跟蹤其內容。 相反, Git將其記錄為來自該存儲庫的特定提交

您可以嘗試以下方法:

  1. ignoreme/目錄復制到新位置,並使其成為git存儲庫

  2. 將其添加為repo2的子模塊:

     git submodule add file:///path/to/ignoreme ignoreme git commit -m"Add ignoreme/ as a submodule" 

ignoreme子模塊現在固定為特定的提交。 repo2仍在跟蹤子模塊內的任何內容,但是除非您在子模塊中提交,否則將不會在repo2跟蹤ignoreme/文件的任何更改。 假設ignoreme/ignore.txt以某種方式被修改:

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#       modified:   ignoreme (modified content)
#
no changes added to commit (use "git add" and/or "git commit -a")

即使你運行git add . ignoreme/ignore.txt的更改將不會添加到索引中,除非它們像這樣提交到子模塊:

$ cd ignoreme
$ git commit -am"Time to change ignore.txt"
$ cd ..
$ git add .
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   ignoreme
#

但是,如果您想忘記子模塊中的本地修改:

$ cd ignoreme
$ git reset --hard
$ cd ..

Git不存儲目錄。 如果你想在Git中保留一個空目錄,那么慣例是在那里放一個名為.keepme的空文件,並提交它。

至於這個問題,就我所知,你將無法在其克隆的上游分支中隱藏文件。 這不是Git旨在做的事情。 考慮其他選項,例如拆分為兩個存儲庫(也許,使用子樹或子模塊)。 或者在上游保留一個單獨的分支以由下游跟蹤,並通過post-receive鈎子過濾該分支中的ignore.txt

告訴我們更多你為什么要這樣做,也許還有更好的方法。

無論如何,我希望你不要試圖隱藏這個文件是出於“安全”的原因 - 否則事情就會復雜得多(例如你必須從整個歷史中清除它等)

簽出具有該文件的提交將替換它,並且從提交轉換到沒有它的提交將刪除它。 Git不能做任何其他事情。 .gitignore不會覆蓋回購,這樣可以方便您的狀態報告。

你可以使文件成為git領域之外某個地方的符號鏈接,這樣可以通過查看糟糕的歷史記錄輕松恢復損壞。 如果那不是一個選項,那就是filter-branch。

Git僅將忽略模式應用於未跟蹤的文件。 您不能使用忽略模式來忽略已經由git跟蹤的文件的更改。 仍然可以參考https://gist.github.com/1423106了解人們解決問題的方法。

請注意,如果您擔心.gitignore本身,您可以嘗試使用.git / info / excludes作為local-repo-only .gitignore文件。 請注意,這不會解決更改跟蹤文件的問題,只會為您提供無法跟蹤的補充.gitignores。

暫無
暫無

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

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