如何使用git只播放新文件的一部分?

时间:2011-06-22 07:58:18

标签: git

git add --interactive 。它现在是我日常工作流程的一部分。

问题似乎不适用于未跟踪的文件。我想要做的是跟踪一个新文件,但只添加它的一部分,即这个新文件的某些部分尚未准备好上演。

例如,使用git add -i,我可以选择补丁选项,甚至可以编辑单个数据库,以便暂存新代码的部分内容,从而使调试代码注释保持未分级状态。我喜欢这种方式工作,因为它很明显我目前正在处理的大型补丁的哪些地方仍然需要工作。

不幸的是,我似乎无法对未跟踪的文件执行相同的操作。要么我暂存整个文件,要么没有。我一直在使用的解决方法是在新文件为空时暂存或提交新文件,然后以通常的方式暂存各个更改。但是这个解决方案感觉就像一个肮脏的黑客,当我忘记或改变主意时,它会造成比应有的麻烦。

所以问题是:如何仅仅暂存新文件的一部分,以便跟踪这个新文件但是将其全部或部分内容保持未分级?

5 个答案:

答案 0 :(得分:361)

哇,所有update-indexhash-object业务似乎过于复杂。怎么样呢:

git add -N new_file
git add -i

来自git help add

-N, --intent-to-add
    Record only the fact that the path will be added later.  An entry
    for the path is placed in the index with no content.  This is useful
    for, among other things, showing the unstaged content of such files
    with git diff and committing them with git commit -a.

答案 1 :(得分:6)

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
git add --interactive newfile

简单演示:

mkdir /tmp/demo
cd /tmp/demo
git init .

echo hello > newfile
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
  • 提示如果您确定git对象数据库中已存在“空”blob,则可以对哈希值e69de29bb2d1d6434b8b29ae775ad8c2e48c5391进行硬编码。我不建议那样做_
  • 提示如果您使用的是Windows,则可以使用NUL:代替/dev/null。否则,请使用echo -n '' | git hash-object --stdin -w
  • 之类的内容

现在索引将包含newfile作为空blob,如果空blob尚不存在,则已将空blob输入到对象数据库中:

<子>

$ find .git/objects/ -type f 
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   newfile
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   newfile
#

$ git diff
diff --git a/newfile b/newfile
index e69de29..ce01362 100644
--- a/newfile
+++ b/newfile
@@ -0,0 +1 @@
+hello

这应该是你想要的。我还建议使用vim fugitive插件进行非常智能的索引管理(参见Better git add -p?

答案 2 :(得分:5)

执行此操作的最简单方法(以及一般的imho交互式分段)是git gui。它与git捆绑在一起,几乎可以在git支持的所有平台上运行。

只需运行git gui,就会打开一个gui,允许暂存和取消暂停,甚至单行跟踪和未跟踪的文件。

Git Gui screenshot

答案 3 :(得分:2)

编辑:现在似乎没有用。我确定它是在之前(在git 1.7.1上)。如果它不起作用,我建议按照上面的建议暂存/dev/null

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile

如果您使用的是Windows(没有/dev/null),则可以将其替换为空文件的路径。

原始回答

你想要

git add -p # (or --patch)

这为我添加了未跟踪的文件。从手册页:

  

互动选择补丁   索引和工作树之间   并将它们添加到索引中。这给了   用户有机会查看   添加修改前的差异   内容到索引。

     

这有效地运行添加   --interactive,但直接绕过初始命令菜单   跳转到patch子命令。看到   “互动模式”了解详情。

答案 4 :(得分:-1)

仅记录另一种可能性: 我用

git add -N file
git add -p file

然后您可以暂存帅哥,或就地编辑它们。