13

只是好奇Git是否有类似Subversions Changelist功能的东西,我发现它在运行时非常方便,我知道我可以运行类似的东西:

cat 'changelistfileimade' | xargs git update

但很好奇是否也有内置方法?

4

2 回答 2

16

我为此搜索了更多内容,我想我已经找到了我在上面的评论中提到的TortoiseSVNignore-on-commit更改列表用例的替代品。有问题的命令是git update-index --assume-unchanged <path/name>. Git 帮助对此有这样的说法:

--[no-]假设不变

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

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

我在Nick Quaranto 的 GitReady 博客上找到了对该选项的解释,其中包括以下内容:

显然,有很多注意事项与此有关。如果你git add直接文件,它将被添加到索引中。合并带有此标志的提交将导致合并正常失败,因此您可以手动处理它。

但这对我来说只是成功的一半。下一步是了解您忽略了什么(并希望记住原因)。这是由 Abe Voelker 对一个恰当命名的问题的方便评论提供的。只需.gitconfig使用代码段编辑您的文件

[alias]
    ignored = !git ls-files -v | grep "^[[:lower:]]"

[alias]如果文件中已经存在,请不要添加该位。现在git ignored会告诉你这样的事情:

h configs/environment/local.php
h configs/logging/log4php.xml

ignore您可以使用别名 for和unignore以下行更进一步:

    ignore = update-index --assume-unchanged
    unignore = update-index --no-assume-unchanged
于 2014-06-24T21:00:27.807 回答
13

我自己从未使用过SVN 更改列表,但如果我理解正确,它允许您将文件分组到更改列表中,然后分别提交这些更改列表。(对?)

我不认为你真的需要 Git 的这样一个特性。您已经可以独立地单独暂存(git add)每个文件或其中的部分(git add -p)并提交这些文件。您可以为每个更改列表创建分支,然后合并/重新设置这些分支。或者您可以创建多个提交,然后使用交互式 rebase ( ) 重新排序它们git rebase -i

而不是svn diff --changelist something,您将简单地使用git show changelistbranch.

您不必推送那些本地/临时分支。在您认为它们已准备好被释放到野外之前,没有人需要看到它们。

您甚至可以命名您的“更改列表分支”:git branch changelist/name_of_your_changelist,然后您将所有更改列表按其前缀分组。

我错过了什么吗?

于 2012-05-15T18:51:23.730 回答