Git:如何列出尝试提交的所有(暂存的)文件

时间:2015-06-25 02:34:27

标签: linux git bash shell unix

为prepare-commit-msg git hook写了一个bash脚本。它列出了所有存在的分阶段文件,但我只想要尝试提交的分阶段文件(即页面底部所需输入/输出的示例)。

我的脚本的工作是阻止提交发生,如果尝试提交的文件没有遵循某种评论约定(即想想java文档)。不仅如此,它还编辑和自动格式化注释以满足我的评论惯例。这一点非常重要,因为我不能只抓取提交的SHA-1,因为这个脚本需要在创建密钥之前发生。

当我执行commit -a(即提交所有文件)时,这非常有效。但是,当我想提交一些我的暂存文件时,我遇到了问题。

有没有办法可以只捕获尝试提交的暂存文件,而不仅仅是每个存在的单个文件?

例如,假设我的暂存文件如下:

file1.txt
file2.txt
file3.txt
file4.txt
file5.txt

当我执行git commit file1.txt file2.txt file3.txt时,我想在我的脚本中抓住file1.txt file2.txt file3.txt但不是file4.txtfile5.txt

有没有这样做?

编辑:绝对不是重复。 “复制”问题的解决方案绝对不是我要求的。

2 个答案:

答案 0 :(得分:4)

grouper

文件E被修改,文件R被暂存(添加)。

非分段文件在第二列中有动作标记(在$ git status -s -uno M E A R 之后,以取消暂存文件E):

git reset E

例如,可以使用$ git status -s -uno M E A R 删除这些内容。

以下是我的测试目录中的完整证明:

跟踪文件

grep -v '^ '

文件系统文件(全部,如 ~/test/ed $ git ls-tree HEAD 100644 blob 96bf192a9be8d1cecc314f66bb1ef5961564e983 E 100644 blob 11470e37f3d22a2548ce5c85040a44c9581d7727 I 100644 blob 8f2f9e95d9b00595d1588ccef91495c06295f5fa O

git commit -a

工作目录的状态:针对HEAD和暂存文件的更改

 ~/test/ed $ ls -l .
total 16
-rw-r--r-- 1 ingo ingo 140 25. Jun 05:48 E
-rw-r--r-- 1 ingo ingo 143 25. Jun 05:39 I
-rw-r--r-- 1 ingo ingo 106 25. Jun 05:29 O
-rw-r--r-- 1 ingo ingo 157 25. Jun 05:28 R

没有修改过的文件的输出在索引中没有或没有(git reset)(也就是说,没有上台或未上台)

 ~/test/ed $ git status -s -uno
 M E
A  R

仅限分阶段文件名,没有操作标志

 ~/test/ed $ git status -s -uno|grep -v '^ '
A  R

答案 1 :(得分:2)

Git提交操作,状态和控制

Git介绍了自己的术语。其中一些词语的使用方式有误,我将描述误解的概念以及导致错误表达的有问题的命令。

幸运的是,git有一个非常强大的定义语言,每个术语都有一个确切的含义,其中一些可以在git help gitglossary中看到。要理解git使用的概念,git help git页面值得阅读5-50次以及从那里链接的介绍性页面。

如果您安装了没有文档的git版本,请拍打系统管理员。我认为,大多数积极阅读问题,答案和文章的人都有自己的管理员,所以要打自己,但不要太难;)当然,文档可以在网上找到,但它们是以下内容的组成部分。使用git安装。

幸运的是git已经启动,它的核心完全由我们这个时代最优秀的人之一写成,或者至少是由一个使用最严格的逻辑概念而不是应用杀手工具来编写和控制他的软件开发的人写的:Linus Thorvalds。

当我们讨论git存储库中的git和操作时,可以使用具有已定义含义的相同术语。我不会深入研究,因为有些概念是在计算机科学中用相当高级的理论术语开发的。

git存储库

有两种主要类型的git存储库,称为barenon-bare,或者我有时会说签出git help init)。在本文中,我将讨论非裸存储库,其中存储库的跟踪文件位于工作目录

  来自gitglossary(7):
 working tree
      The tree of actual checked out files. The working tree normally 
      contains the contents of the HEAD commit’s tree, plus any local
      changes that you have made but not yet committed.

Noobs的注意事项:gitglossary(7)表示名称为" gitglossary"的手册页。在第7部分中。使用man,可以使用man -s7 gitglossary访问此页面。如果您的系统配置为将html页面远程调用到您的浏览器会话中,则git help gitglossary会在git help --web gitglossary中显示浏览器格式正确的文档。对于没有man的Windows,您将始终被引导至浏览器。对于git命令,例如添加,手册页为man 1 git-addgit-add(1)

跟踪文件

我们在这里看到,术语跟踪意味着git存储库知道并控制该文件。词汇表不是来自gitglossary(7),而是来自git-add(1)选项

  -u, --update
        Update the index just where it already has an entry matching 
        <pathspec>. This removes as well as modifies index entries to 
        match the working tree, but adds no new files.

      If no <pathspec> is given when -u option is used, all tracked 
        files in the entire working tree are updated (old versions of 
        Git used to limit the update to the current directory and
        its subdirectories).

命令 git add --update 是理解git在工作树中处理的最重要的操作之一。

此处显示问题

使用git commit file1.txt file2.txt file4.txt,但首先要定义一些更多的术语。

分阶段文件或索引

一组暂存文件构建index(请参阅index的gitglossary(7),但忽略几个合并级别或未合并索引)。为了我们的目的

  

The index is a stored version of your working tree.

即工作树的存储版本,准备作为一个commit提交(再次gitgloassary(7)

  

commit       `作为名词:Git历史中的一个点;

......&#34;修订版&#34;或&#34;版本&#34;是来自其他版本控制系统的同义词。作为Git用户,我们说&#34; commit&#34;。

......待续(26.Friday)......