【问题标题】:What is a practical workflow for keeping local changes uncommitted in git?在 git 中保持本地更改未提交的实用工作流程是什么?
【发布时间】:2012-05-01 10:36:19
【问题描述】:

我想要做的已经在that question 中描述过了。但我想以一种更实用、更通用的方式解决这个问题。所以用例如下:

  • 我在多个文件 web.configcreateDb.sql 或任何其他文件中进行了多项本地更改
  • 我不想提交这些文件,因为更改只针对我的本地计算机
  • 这些文件必须受版本控制,而且其中一些文件经常进行更改(尤其是 sql 脚本),所以我想接收这些文件的更新
  • 确实想要提交所有其他文件
  • 我希望能够在一个命令中毫无摩擦地做到这一点(使用 posh-git,因此欢迎使用 powershell)

链接到的解决方案据说使用git add -p,这不实用,一直手动挑选块很无聊,或者也许有更方便的方法?

例如,以下其中一项可能有效:

  • 如果能够在将工作副本中的文件添加到索引之前过滤它们,例如git -add -A -EXCEPT web.config crateDb.sql。然后我可以将一个 git 别名映射到它,就是这样。
  • 如果有取消应用存储的能力。我的意思是从工作副本中删除一个特定存储中包含的更改。所以我必须在每次提交之前做类似git stash -deapply 的事情,这也很好。

这个问题很常见,奇怪的是目前没有解决方案。例如。 TortoiseSVN 具有“ignore-on-commit”功能,Perforce 允许将该类型的本地更改存储在单独的更改列表中,并且从不提交。

【问题讨论】:

  • 除了提交更改之外,您还能如何“版本控制”这些文件?在 git 中,提交 is 是本地的,而 push 会影响其他计算机/存储库。对我来说,这听起来像是一个更好的解决方案,例如 this
  • 我有一个更好的配置文件解决方案-NConifig,但问题是我不仅有配置文件。

标签: git version-control dvcs


【解决方案1】:

您可以在 git 提交之前尝试执行以下操作:

git update-index --assume-unchanged web.config crateDb.sql

来自 git 帮助:

--假设不变

--no-assume-unchanged

当指定这些标志时,为 路径未更新。相反,这些选项设置和 取消设置路径的“假设不变”位。当“假设 未更改”位打开,git 停止检查工作树文件 可能的修改,所以你需要手动取消设置位来告诉 git 更改工作树文件时。这有时很有帮助 在非常慢的文件系统上处理大型项目时 lstat(2) 系统调用(例如 cifs)。

此选项也可以用作粗略的文件级机制 忽略跟踪文件中未提交的更改(类似于 .gitignore 对未跟踪的文件执行此操作)。 Git 将失败(优雅地)以防万一 在索引中修改此文件,例如合并提交时;因此, 如果假定的未跟踪文件在上游发生更改,您将需要 手动处理这种情况。

【讨论】:

  • 在那之后 git 会如何表现?它还会跟踪这些文件吗?如果我会得到一个会发生的更新?
  • @Restuta 文件仍然会被 git 跟踪,但 git 会暂时将它们视为未更改,即使它们已更改。所以 git status 等不会报告正在更改的文件。使用 --no-assume-unchanged 撤消命令,让 git 再次关心更改。
  • 您确定处于 --assume-untracked 状态时会更新吗?或者你的意思是我必须“取消跟踪 -> 提交 -> 跟踪”?
猜你喜欢
  • 2018-04-02
  • 2022-01-03
  • 2012-05-11
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2016-08-10
相关资源
最近更新 更多