我可以"提交"一个文件并忽略其内容更改吗?

Der*_*ley 325 git gitignore

我团队中的每个开发人员都有自己的本地配置.该配置信息存储在一个文件中,该文件devtargets.rb在我们的rake构建任务中使用.不过,我不希望开发人员破坏对方的devtargets文件.

我的第一个想法是将该文件放在.gitignore列表中,以便它不会被提交给git.

然后我开始想知道:是否可以提交文件,但忽略对文件的更改?所以,我会提交一个默认版本的文件,然后当开发人员在本地机器上更改它时,git会忽略这些更改,当你执行git status或git commit时它不会显示在已更改文件列表中.

那可能吗?这肯定是一个很好的功能......

Rob*_*son 427

当然,我不时会这样做

git update-index --assume-unchanged [<file> ...]
Run Code Online (Sandbox Code Playgroud)

要撤消并再次开始跟踪(如果您忘记了哪些文件未跟踪,请参阅此问题):

git update-index --no-assume-unchanged [<file> ...]
Run Code Online (Sandbox Code Playgroud)

相关文件:

- [no-]假设未更改
指定此标志时,不会更新为路径记录的对象名称.相反,此选项设置/取消设置路径的"假定未更改"位.当"假设未更改"位打开时,用户承诺不更改文件并允许Git假定工作树文件与索引中记录的文件匹配.如果要更改工作树文件,则需要取消设置该位以告知Git.当在具有非常慢的lstat(2)系统调用的文件系统(例如cifs)上处理大项目时,这有时是有用的.

如果需要在索引中修改此文件,例如在提交中合并时,Git将失败(优雅); 因此,如果上游更改了假定未跟踪文件,则需要手动处理该情况.

在这种情况下优雅地失败意味着,如果在执行拉动时该文件的上游有任何更改(合法更改等),它将说:

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext
Run Code Online (Sandbox Code Playgroud)

并将拒绝合并.

那时,您可以通过恢复本地更改来克服这个问题,这是一种方式:

 $ git checkout filename.ext
Run Code Online (Sandbox Code Playgroud)

然后再次拉动并重新修改你的本地文件,或者可以设置–no-assume-unchanged,你可以在那时进行正常的存储和合并等.

  • @Magus:没有.这只适合你. (14认同)
  • 这个命令在.git文件夹中本地执行它的操作吗?我的意思是,如果我为config.php文件运行此命令,它会传播给使用repo的其他用户吗? (8认同)
  • 使用"git stash"时,以这种方式忽略的文件更改将丢失.有办法吗? (8认同)
  • 稍后您将要知道如何确定文件是否保持不变:http://stackoverflow.com/questions/2363197/can-i-get-a-list-of-files-marked-assume-不变 (2认同)
  • 这不是`git update-index --assume-unchanged`的作用。https://public-inbox.org/git/xmqqy4z5go1y.fsf@gitster.dls.corp.google.com/ (2认同)

161*_*903 84

执行此操作的首选方法是使用git update-index --skip-worktree <file>,如此答案中所述:

assume-unchanged是为检查一组文件是否已被修改而昂贵的情况而设计的; 当您设置该位时,git(当然)假定在工作副本中尚未修改与该索引部分对应的文件.所以它避免了一堆乱的状态调用.只要索引中的文件条目发生更改(因此,当文件在上游更改时),此位就会丢失.

skip-worktree不止于此:即使git知道文件已被修改(或需要通过重置 - 硬件等修改),它也会假装它没有使用索引中的版本.这将持续到索引被丢弃.

要撤消此操作,请使用 git update-index --no-skip-worktree <file>

  • @momomo 标志存储在索引中,所以不,它仅适用于单个用户。有关适用于所有用户的内容,请参阅 [erjiang's answer](/sf/answers/232373851/)。 (3认同)
  • 这是否适用于所有签出存储库的用户?他们是否会获得某些文件,但不再能够错误地添加更改,除非明确说明如此? (2认同)
  • [Git 文档](https://git-scm.com/docs/git-update-index#_notes) 特别指出不要使用 `git update-index --skip-worktree` 来实现此目的。 (2认同)

erj*_*ang 39

通常的做法似乎是创建devtargets.default.rb并提交它,然后指示每个用户将该文件复制到devtargets.rb(位于.gitignore列表中).例如,CakePHP对其数据库配置文件执行相同操作,该文件自然地在机器之间发生变化.

  • @DerickBailey但公平地说,记住复制文件比记住使用`--assume-unchanged`选项对每个克隆存储库的人更容易. (8认同)
  • 您无法.gitignore正在跟踪的文件..gitignore仅对不在索引中的文件有效. (6认同)

bk2*_*204 6

使用 Git 无法忽略对跟踪文件的更改。Git常见问题解答对此进行了解释

\n
\n

Git 没有\xe2\x80\x99t 提供执行此操作的方法。原因是,如果 Git 需要覆盖此文件(例如在签出期间),它\xe2\x80\x99 不知道对文件的更改是否宝贵并应保留,或者它们是否不相关并可以安全地销毁。因此,必须采取安全路线并始终保护它们。

\n

它\xe2\x80\x99s很容易尝试使用 git update-index 的某些功能,即假设不变和跳过工作树位,但这些不能\xe2\x80\x99不能正常用于此目的,并且应该\xe2\ x80\x99不能这样使用。

\n
\n

如果您的目标是使用配置文件,那么最好的办法是添加示例或模板文件,然后让用户将其复制到位或让脚本创建适当的文件。然后,您应该忽略实际配置文件的位置,只签入示例或模板。

\n