簡體   English   中英

如何讓 git 忽略文件的未來修訂?

[英]How can I make git ignore future revisions to a file?

我創建了一個包含在 git 存儲庫中的文件的默認版本。 重要的是,當有人克隆存儲庫時,他們會獲得此文件的副本。 但是,我想設置 git,以便它稍后忽略對此文件的更改。 .gitignore僅適用於未跟蹤的文件。

我的動機是該文件包含特定於機器的信息。 我想提供默認值,同時允許人們進行不會被推回原始存儲庫的本地更改,當我們拉新更改時會產生合並沖突。

我們通常很懶惰並使用git add . 很多,所以我很確定如果我不能告訴 git 忽略這個文件,對它的更改最終會被提交和推送。

總結一下,

  1. 我想創建一個文件,將其命名為default_values.txt ,該文件將添加到我的 git 存儲庫中,並在有人克隆該存儲庫時包含在內。
  2. git add . 不應將default_values.txt添加到提交中。
  3. 此行為應傳遞給存儲庫的任何克隆。

正如許多其他人所提到的,一個好的現代解決方案是:

git update-index --skip-worktree default_values.txt

這將忽略對該文件的更改,包括本地和上游,直到您決定再次允許它們:

git update-index --no-skip-worktree default_values.txt

您可以獲得標記為跳過的文件列表:

git ls-files -v . | grep ^S

請注意,與--skip-worktree不同,一旦上游更改被拉動, --assume-unchanged狀態將丟失。

您正在搜索的是git update-index --assume-unchanged default_values.txt

有關更多詳細信息,請參閱文檔: http : //www.kernel.org/pub/software/scm/git/docs/git-update-index.html

我通常看到的方法是創建一個具有不同名稱的文件,例如:default_values_template.txt 並將 default_values.txt 放在您的 .gitignore 中。 指導人們將 default_values_template.txt 復制到他們本地工作區中的 default_values.txt 並根據需要進行更改。

看看污跡/清潔腳本。 通過這種方式,您可以對文件進行版本控制,但是當它被檢出時,您將通過用文件中的機器特定數據替換通用/占位符數據來“塗抹”它。

當您提交它時,您將通過用通用或占位符信息替換機器特定信息來“清理”它。

塗抹/清理腳本必須是確定性的,因為多次應用它們,以不同的順序將相當於只運行序列中的最后一個。

如果您需要公開您的存儲庫,但內容可能包含敏感信息,同樣可以應用密碼。

我通過定義“干凈”過濾器來簡單地將文件的內容放在索引中解決了這個問題。

git show :path/to/myfile應該只打印指定文件的索引內容,因此我們可以在腳本中使用它來用索引中未修改的副本替換工作副本:

#! /bin/sh

git show :$1

將其設置為相關文件的“干凈”過濾器(假設您已將其放在“discard_changes”中):

$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes

不幸的是,我找不到一種方法可以將其推廣到多個文件,因為無法從干凈的腳本內部判斷我們正在處理哪個文件。 當然,沒有什么可以阻止您為每個文件添加不同的過濾規則,但這有點笨拙。

我找到了一個適用於我的團隊的解決方案。 我們通過符號鏈接共享我們的 githooks,在向 git 添加模板文件后,我添加了一個預提交鈎子,檢查模板文件是否已被修改,如果是,我git reset -- templatefile.txt 如果它是唯一更改的文件,我也會中止提交。

我建議查看子模塊。 如果您將機器特定的文件放在子模塊中, git add 應該忽略它。

暫無
暫無

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

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