2016-11-01 116 views
0

這是我的情況。我在分支A上,在那裏我對本地工作副本上的某個文件進行了一些更改。Git忽略不工作

/launcher/file.esb

我基本上要執行以下操作:

  1. 忽略這個文件完全所做的更改。我用 完成了這個假設 - 不變
  2. 從版本控制中解除這個文件,我試圖用.gitignore來完成這個文件。

  3. 當我簽出不同分支時,保留對本地工作文件夾中此文件的更改。 A->培養─> B->ç等...

這是#3,我沒能做到。只要我簽出一個新的分支並執行pull操作,舊的更改就會覆蓋該文件。

這是怎麼發生的?不應該將這個文件路徑包含到.gitignore中,這個文件完全無法使用版本控制觸角?

我該如何實現#3?

這個問題不同於「可能的重複」鏈接中提到的問題。 繼承人爲什麼:

這裏基本上是我想要的內容。 「把我的這個特定的文件放在一個'shell'中,這個文件在任何git操作中都不會被覆蓋,也不會在被修改時被考慮到。」它基本上不包括該文件和staging/remote之間的任何形式的版本控制同步。此本地文件和分段/遠程版本必須存在相互連接和完全斷開連接。

+0

可能重複[停止跟蹤並忽略Git中文件的更改](http://stackoverflow.com/questions/936249/stop-tracking-and-ignore-changes-to-a-file-in-git ) –

回答

4

這是因爲該文件已經是存儲庫的一部分。因此,當您切換分支時,您將從您正在檢出的分支中獲取此文件的版本。 gitignore文件僅阻止git查看不屬於存儲庫一部分的文件。這是完成的,所以git不包括命令中的某些文件,如git add .git commit -a。假設 - 未改變的選項會讓git看不到更改,但這意味着Git可以在簽出時自由覆蓋文件,因爲它知道文件與提交版本沒有區別。

如果你想要從git控制中刪除這個文件並自己管理它的變化,你可以使用git rm --cached /launcher/file.esb並提交修改。這將從索引中刪除該文件,該文件將不再由git進行跟蹤。 --cached選項可防止git從您的工作目錄中實際刪除文件。不過,您可能必須爲每個分支單獨執行此操作,因爲從一個分支中刪除文件不會將其從其他分支中刪除。要做到這一點,您可能需要撤消假設 - 不變,然後使用git stash命令臨時隱藏您的本地更改。

+0

git rm --cached,我已經試過了,就像上百萬次。問題是,當我提交git rm'd文件並將分支推送到原點時,該文件在PR期間顯示爲「已刪除」。當我嘗試將我的分支與開發合併時,該文件是否會從Dev中實際刪除?無論哪種情況,我都遇到麻煩,因爲該文件在PR期間顯示爲已刪除。 – Ace

+0

這裏基本上是我想說的。 「把我的這個特定的文件放在一個'shell'中,這個文件在任何git操作中都不會被覆蓋,也不會在被修改時被考慮到。」它基本上不包括該文件和staging/remote之間的任何形式的版本控制同步。此本地文件和分段/遠程版本必須存在相互連接和完全斷開連接。 – Ace

+0

據我所知,沒有標準的做你想做的方式。當你做'git pull'時,你基本上將遠程倉庫合併到你的本地倉庫('git pull'基本上是'git fetch'和'git merge'的一個快捷方式)。所以如果一個文件被遠程控制,它將被合併到本地的一個拉。簡單的解決方法是在執行'git pull'之前執行'git stash'並在執行完後執行'git stash pop',這樣您的本地更改就會保留下來。只要該文件沒有被其他人以可能導致衝突的方式更改,那應該可以正常工作 –

1

從版本控制中解除這個文件,我試圖用.gitignore來完成這個文件。

你試過了,你失敗了。只有在更新索引時纔會讀取.gitignore,即您準備下一次提交。如果文件已經提交,將其添加到.gitignore無助於告知Git停止跟蹤文件。

您還必須從索引中刪除(使用[git rm --cached](https://git-scm.com/docs/git-rm))並提交更改。只有在Git停止跟蹤文件。將它的名稱添加到.gitignore只會告訴它不要將它列入git status輸出的Untracked files部分。

但是,如果您簽出在從回購庫中移除文件之前創建的提交,提交包含該文件,Git也會嘗試檢查它。