Git在repo之外合并文件内容(--无索引)

Git在repo之外合并文件内容(--无索引),git,diff,git-merge,git-add,git-apply,Git,Diff,Git Merge,Git Add,Git Apply,git diff命令(带有--no index标志)非常适合区分两个文件,无论这两个文件是否包含在git repo中 示例 $ git diff --no-index -- filea fileb // shows diff between filea and fileb 问题 如果内容不是Git repo的一部分,是否也可以使用Git选择性地将内容从一个文件“合并”(即,Git添加)到另一个文件?基本上类似于一个git add-p,但不是从工作目录到索引,而是从fileb到filea 我觉得

git diff
命令(带有
--no index
标志)非常适合区分两个文件,无论这两个文件是否包含在git repo中

示例

$ git diff --no-index -- filea fileb
// shows diff between filea and fileb
问题

如果内容不是Git repo的一部分,是否也可以使用Git选择性地将内容从一个文件“合并”(即,
Git添加
)到另一个文件?基本上类似于一个
git add-p
,但不是从工作目录到索引,而是从
fileb
filea

我觉得所有的基本构建块(管道命令)都应该可用。可能涉及
格式补丁
和/或
应用

$ <command> filea fileb
// wanted: interactively choose patches/hunks from fileb and apply them to filea
$filea fileb
//需要:以交互方式从fileb中选择补丁/大块,并将其应用于filea

git add-p命令是或至少是一个大型Perl脚本。要查看它,请找到“核心”目录:

git --exec-path
它将打印类似于
/usr/lib/git-core
/usr/local/libexec/git-core
的内容。这就是各种Git内部二进制文件和脚本所在的位置

在打印出来的任何目录中,查找
git add--interactive
。这是或曾经是git add-p的
code

这个Perl程序运行Git diff和apply命令,并且应该相对容易修改,以使其执行您希望执行的操作。请注意,这用于所有的
git add-p
git reset-p
、和
git checkout-p
,这就是它将近2000行长的原因


<> P.Git项目的人正处于重写这一切的过程中,使你不可能修改。呃,也就是说,要让它以C语言编写以快速运行,您仍然可以拥有源代码,并且仍然可以随心所欲地修改它,但是作为一个C程序,它将更难处理。

git diff——没有索引
几乎只是一个普通的
diff
,如果您想在任意文件中应用更改块,使用一个普通的合并工具,比如
vimdiff
——这与用作Git合并工具的
vimdiff
更难区分,因为它是完全相同的东西

git add
用于向repo添加内容,您不是在工作树的两条路径上工作,而是在工作树的一条路径上工作,以及在该路径上索引的任何内容。特别是,您不能选择使用两个不同的名称

但Git本身只有在以下情况下才能找到它的工作树(以及repo、对象和索引…) 你没有明确告诉它它们在哪里。如果您在某处有
filea
的快照,比如在
/path/to/filea
,您可以

git --work-tree /path/to add -p filea`

git将在
filea
的路径上向索引中注册的
filea
内容添加一个补丁。

虽然它没有直接回答我的问题,但这仍然是非常有用和有趣的信息。谢谢@torek!非常有趣,这是朝着正确的方向发展的。但是,正如您所提到的,只有当这两个文件位于两个不同的目录中并且两个目录都是Git repos.No时,它才能正常工作。另一个目录可以是任何内容。你可以明确地告诉它把哪个目录作为工作树的根目录,把哪个目录作为主repo目录,把哪个文件作为索引列表,在哪里找到它的对象数据库,如果你不告诉它,Git会自动找到所有这些东西,但你可以告诉它。嗯,也许我误解了。如果
/path/to
不是Git repo,那么命令只会告诉我
没有更改。
。使用Git版本
2.25.0
有趣而有用的技巧:只需将工作树设置为一个
Git add-p
@friederbluemle,然后该路径上的
filea
与该文件的索引内容匹配,或者该文件根本没有索引,您应该首先添加它。是的,那就是,嗯,我们能不能就它现在的行为定下“古怪”的定论?不过,我不会反对“错误”@托瑞克:是的。这使得从供应商Tarbolls导入新版本非常方便。