Git:提交并自动添加所有未跟踪的文件

我经常忘记我有一些新的文件,直接做,

git commit -a -m "My commit message" 

这只会提交已更改的文件,而我必须在新的提交中添加剩余的文件。 这意味着有两个单独的提交,尽pipe逻辑上他们是同一个任务的一部分。

我知道通过两个连续的命令在提交中包含未跟踪文件的最简单的方法:

 git add -A git commit -a -m "My commit message" 

在一个命令中是否可以像上面那样得到相同的效果?

在您的执行path中创build一个名为(无扩展名)的文件: git-add-commit-untracked

把它放在里面:

 #!/bin/bash message=${0} git add -A git commit -am "$message" 

然后: git-add-commit-untracked "Commit message"

尽pipe你可以使用一个较短的文件名。 为了便于说明,我把它留下了很长时间。

这里有几个选项:

  • 使用git commit --amend以便在添加未跟踪文件后最终只有一个提交(但如果您已经推送了前一个提交,则不会);
  • 使用git commit --interactive ;
  • 创build一个自动添加新文件的别名或脚本(其他答案中的示例)。 这里有两个我完全用于这个目的的别名:

     [alias] untracked = ls-files --other --exclude-standard add-untracked = !git add $(git untracked) 
  • 使用git rebase -igit reset <commit prior to first commit>git commit ,或者git merge --squash到另一个分支来git merge --squash你的两个提交。

但是,您不能覆盖内置命令,如使用别名commit ,所以在提交之前,请记住要将索引文件添加到索引。

不幸的是,你不能指定path和git commit -a ; 我只是尝试了git commit -a $(git untracked) ,它告诉我fatal: Paths with -a does not make sense. 所以要回答你的基本问题,我认为git脚本将是唯一的非交互方式。

你可以定义一个别名,在commit之前添加所有的。 只需将这些行放入你的〜/ .gitconfig文件即可:

 [alias] ca = !sh -c 'git add -A && git commit -m \"$1\"' - 

然后使用你的别名是这样的:

 $ git ca 'Your commit message' 

使用默认的git界面是不可能的。 但是, git支持别名

使用别名,可以调用不同的git命令,甚至可以运行任意的shell脚本。 创build一个包含这两个命令的脚本,并将其别名。

有关别名的更多信息,请参阅wiki ,以及针对此特定scheme的此问题 。

编辑:请注意,这不是一个好主意。 您可能会错误地添加不必要的文件,或由于树中的非版本化文件而产生无用的别名。

是的,我过去和你有同样的问题。 我更喜欢使用git命令,但是我遇到了一个很大的麻烦,因为在rails中的警卫改变了许多文件没有警报:)

所以,现在,每当我提交新代码,我尝试使用用户界面来做到这一点(git gui),并牢记永远不要使用git commit -a因为你不确定哪些文件被修改! 在重新绑定新代码之后,请您gitk查看git树,以便您可以了解持续的承诺,提交者,提交文件等等。