Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用git仅暂存新文件的一部分?_Git - Fatal编程技术网

如何使用git仅暂存新文件的一部分?

如何使用git仅暂存新文件的一部分?,git,Git,I爱git添加——交互式。它现在是我日常工作流程的一部分 问题似乎是它不适用于未跟踪的文件。我想做的是跟踪一个新文件,但只添加其中的一部分,即此新文件的某些部分尚未准备就绪 例如,使用GitAdd-i,我可以选择补丁选项,甚至编辑单个大块,以便将新代码的一部分分段,而不保留调试代码注释。我喜欢用这种方式工作,因为它可以让我清楚地看到,我目前正在开发的巨型补丁的哪些地方仍然需要工作 不幸的是,我似乎无法对未跟踪的文件执行相同的操作。要么我把整个文件归档,要么什么都不归档。我一直在使用的解决方法是在

Igit添加——交互式。它现在是我日常工作流程的一部分

问题似乎是它不适用于未跟踪的文件。我想做的是跟踪一个新文件,但只添加其中的一部分,即此新文件的某些部分尚未准备就绪

例如,使用GitAdd-i,我可以选择补丁选项,甚至编辑单个大块,以便将新代码的一部分分段,而不保留调试代码注释。我喜欢用这种方式工作,因为它可以让我清楚地看到,我目前正在开发的巨型补丁的哪些地方仍然需要工作

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

所以问题是:如何只暂存一个新文件的一部分,以便跟踪这个新文件,但不保存其全部或部分内容

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上,您可能只需要使用
    num:
    而不是
    /dev/null
    。否则,使用类似于
    echo-n'| git散列对象--stdin-w
现在索引将包含
newfile
作为空blob,如果空blob还不存在,则已将其输入到对象数据库中:

$find.git/objects/-type f
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
$git状态
#论分行行长
#
#初始提交
#
#要提交的更改:
#(使用“git rm--cached…”取消存储)
#
#新文件:新文件
#
#已更改但未更新:
#(使用“git add…”更新将提交的内容)
#(使用“git签出--…”放弃工作目录中的更改)
#
#修改:newfile
#
$git diff
diff——git a/newfile b/newfile
索引e69de29..ce01362 100644
---a/新文件
+++b/新文件
@@ -0,0 +1 @@
+你好

这正是你想要的。我还可以推荐用于非常智能的索引管理的vim Squisite插件(请参阅)

编辑:现在似乎不起作用。我确信它是以前的(在Git1.7.1上)。如果它不起作用,我建议按照sehe上面的建议登台
/dev/null

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
如果您在Windows上(没有
/dev/null
),则可以将其替换为空文件的路径

原始答案

你想要

git add -p # (or --patch)
这为我添加了未跟踪的文件。从手册页:

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

这有效地运行了add --交互式,但绕过初始命令菜单,直接 跳转到patch子命令。看见 “交互模式”了解详细信息


哇,所有的
更新索引
散列对象
业务似乎过于复杂了。这个怎么样

git add -N new_file
git add -i
从git帮助添加

-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.

最简单的方法是
gitgui
。它与git捆绑在一起,应该可以在git支持的几乎所有平台上使用

只需运行
gitgui
,就会打开一个gui,允许暂存和取消暂存大块文件,甚至是单行被跟踪和未跟踪的文件


为了记录另一种可能性: 我用


然后你就可以把大块头放在舞台上,或者就地编辑它们。

不管多么有趣,这对我来说都不管用(git 1.7.4)
git add-p newfile
根本不起作用(nu效果),而
git add--interactive
“[a]dd untracked”具有
git add newfile
的效果;编辑也使用git 1.7.5.3进行检查;没有很好的Windows提示,在我的回答中添加了提示。这似乎很有效。我把它化名为“stage empty file”,因为它的记忆有点复杂。@dave1010:很高兴它有帮助!是的,我考虑过添加一个别名,但我不知道您通常希望如何处理通配符或多个文件名参数。所以我选择不使用++1!应得的信用。我确实有点太相信我现在知道这些手册了<代码>
找到了。我应该把手册页再翻一点。也许我应该归还Git Pro徽章。我想知道为什么Git gui不在内部使用它,以便能够从一个新文件中生成行。太棒了
-N
发现,谢谢!虽然我更喜欢在这种情况下将其与
-p
结合使用
gid add-N_文件
&
git add-p
。应该补充的是,
-N
也适用于
-A
@Deiwin-您可以在.gitconfig中添加一个[guitool]来执行“git add-N$FILENAME”:[guitool“add with intent”]cmd=“git add-N$FILENAME”needsfile=yes noconsole=yes这是一个创造性的答案,有时非常有用,非常有用。请注意,并非所有git发行版都包含
GitGUI
。例如,在Debian中,它位于一个名为“git gui”的单独软件包中。多年来,我一直在寻找(不够努力)此功能,这是一个生命的改变。对我来说,在
git gui
中暂存单行未跟踪文件从未奏效。事实上,我肯定在问题中遗漏了这一点——我的屏幕截图显示了一个已经跟踪的文件。如果您想对新文件使用
git gui
,必须首先运行
git add-N new_file
——请参阅Richard Hansen的
-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.
git add -N file
git add -p file