我有两个git repos,它们是彼此的分叉,我需要偶尔将提交从一个提交到另一个.
例如:
git-repo1 有这个目录结构:
repo1/project1/src
repo1/project2/src
while git-repo2具有以下目录结构:
repo2/src/
我想要做的是进行一系列提交并仅为改变特定子目录(例如repo1/project1/src)中的文件的提交生成补丁,并忽略所有仅在其他地方改变文件的提交.
或者,为所有提交生成修补程序,但仅在应用程序修改特定目录中的文件时应用修补程序.
我需要保留有关提交的元数据,因此使用git diff它似乎不是一个可行的选项.
forked git repos之间的目录结构不同.
有没有直接的方法来做到这一点?
UPDATE1
在处理不同的目录结构方面,我看到了这个问题(如何将git补丁从一个存储库应用到另一个存储库?)
但是,如果修补程序谈到修改根本不存在的文件会怎么样?我想忽略这些变化.
假设补丁是从过去的特定提交创建的,并且不再适用于HEAD。
我如何找到HEAD历史记录中的第一个提交或更好的最后一个提交,在此补丁中加上“ git apply”?也许有git bisect吗?但是哪个命令会告诉我是否有补丁?
理想情况下,除非有冲突,否则我想返回到该提交,应用补丁,然后基于原始HEAD或与之合并,然后再次进行比较以创建新补丁。在此之后,我想回到原始的HEAD,以便可以继续安装更多补丁。
背景:有许多补丁需要重新发布...(是的,在某些生态系统中,补丁仍然很重要。)
我试图将更改分为几个提交,但是在手动编辑块时遇到了一个问题。
原始大块头:
@@ -116,8 +116,8 @@
context
context
- remove 1
- remove 2
- remove 3
+ add 1
+ add 2
+ add 3
context
context
context
Run Code Online (Sandbox Code Playgroud)
我只希望上演“删除1”和“删除2”所发生的更改。换句话说,我需要将“删除3”从提交中排除。
我尝试了这个:
@@ -116,4 +116,4 @@
context
context
- remove 1
- remove 2
+ add 1
+ add 2
Run Code Online (Sandbox Code Playgroud)
但是它一直输出不适用的补丁。我只删除了最后的上下文行,并“删除了3”和“添加3”行。我编辑了大块的范围并减去了4条排除的行(其中3条是上下文1是更改,1条已删除和1条添加)
我使用了两个不同的编辑器,“ nano”和“ sublime text”,它们的结果相同。我确保没有被注释掉的空行。
我究竟做错了什么?
TL,博士;
我正在寻找 git 命令、bash 脚本或 npm 方法(脚本)来获取.patch文件夹中的所有文件并运行
git apply --ignore-whitespace patches/{filename}
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的:
git am --ignore-whitespace patches/*.patch
Run Code Online (Sandbox Code Playgroud)
上下文(我将用它做什么)
目前正在进行一个大型项目,使用相当多的库。我们使用 webpack,前端是 Angular.js,后端是 Yii2。由于开发人员同时使用 Linux 和 Windows,因此该项目是在 docker 映像内编译的。
到目前为止,每当我们需要对库进行更改时,我们都会对它进行分叉并在以下位置指定分叉package.json:
"package-name":"git+https://github.com/{git-user}/{package-name}"
Run Code Online (Sandbox Code Playgroud)
而且...它有效。
我最近发现了一种可以说是更好的将补丁应用于模块的方法,那就是patch-package. 简而言之,它避免了分叉,将更改保存在.patch文件中。
然而,创建补丁文件还不够。在部署时,也需要在构建之前应用。这将转换为部署脚本中的以下行:
docker exec -it {container-name} bash -c "git apply --ignore-whitespace patches/{package-name}+{package-version}.patch"
Run Code Online (Sandbox Code Playgroud)
其中必须在运行之前运行npm run build。
而且,它再次有效。
问题
我正在寻找一种方法来自动获取patches/文件夹内的每个文件并应用它们,而无需逐一指定它们。这样,每当.patch将新的补丁推送到补丁文件夹中(或者修改现有的补丁)时,它都会在构建之前自动应用于包,而无需更改部署脚本。
我发现这个问题似乎表明
git am --ignore-whitespace patches/*.patch
Run Code Online (Sandbox Code Playgroud)
可能会成功(当然是在 docker 控制台内)。然而,man页面上git-am说:
从邮箱应用一系列补丁 …
如何从github应用补丁?
我试着编译minisat,但是我遇到了两个来自clang编译的问题.
第一个问题是在这个github提交中解决的,它是从原来的github派生出来的.由于变化很小,我可以轻松地修补代码以手动工作.
第二个问题在这个github(https://github.com/niklasso/minisat/pull/17)中解决,但补丁不适用于原始源.我可以通过复制修改后的文件手动更新代码,但如果我可以将此补丁拉入我的本地目录会更好.用github可以做到吗?如果是这样,怎么办?
我是git的新手,我只是想知道是否有可能从两个不同的文件创建git补丁。没有git repo,方案是我有一个文件并对其进行了修改,现在我想创建一个补丁,其中包含这两个文件之间的差异。有指针吗?还是我应该继续创建仓库,然后修改文件然后提交更改?
我的一位大学同事认为通过克隆存储库并将其内容复制到新的初始化存储库但没有.git原始存储库中的文件夹来分叉存储库是个好主意.之后,他只使用一次提交就提交了此副本,整个团队就开始根据此提交开发项目:
A <- B <- C <- D <- E (original repository)
\ clone / |_____|
\ / |
\ / Ofc. work on the original repository was continued after cloning...
\ /
M <- N <- O <-P (our "fork", commits from my team)
Run Code Online (Sandbox Code Playgroud)
现在,我的第一个目标是获得以下存储库结构:
A <- B <- C <- N <- O <- P
Run Code Online (Sandbox Code Playgroud)
我在过去几个小时里一直试图做的事情如下:
git diff > /path/to/patch 从叉子里面.git apply 在原始存储库中.A使用将其重置为提交git reset --hard COMMIT_HASH_A. …我试图从我的分支中的多个提交创建一个git补丁.但是,我需要从任意提交创建它(它们不一定在一个范围内).在我想要创建补丁的提交之间,某些提交更改补丁中的某些文件可能也已更改.
这是我的用例(假设更大的数字=以后的提交日期):
develop HEAD
Commit 5 - Changed a.txt
Commit 4 - Changed a.txt, b.txt, c.txt
Commit 3 - Changed b.txt, c.txt
Commit 2 - Changed a.txt
Commit 1 - Changed a.txt, b.txt, c.txt, d.txt
master HEAD
Run Code Online (Sandbox Code Playgroud)
现在,我希望能够从开发分支为提交1,3和5创建补丁,并将它们应用于主分支.
我环顾四周,我能找到的是能够在一个范围内创建补丁的能力.有没有办法为多个提交创建一个补丁,它们之间的文件可能会发生变化?
我有这个补丁文件,它包含一堆修改,我想将其应用于git分支。但是,我不想对所有这些修改都进行一次唯一提交,而是想将其分为2或3次提交。
我知道我可以通过首先应用补丁来实现此目的,然后进行交互式添加(逐块),如下所示:
git apply mypatch
git add -p
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否可以在一个git命令中做到这一点。我发现没有什么的联机帮助页git apply,也不在git add。
编辑
我不认为此问题应被视为具有多个命令的Git别名语法的重复,因为该问题(及其答案)不需要涉及传递给别名的参数。
我想git add -p在包含括号的完整路径的文件上运行,如下所示:
git add -p "(External)/Project/Filename.cs"
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,出现以下错误:
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `git ls-files -- (External)/Project/Filename.cs'
Run Code Online (Sandbox Code Playgroud)
我也试过使用 转义括号\,但我得到了同样的错误。为了进行比较,常规git add的括号没有问题。
如何将此文件传递给git add -p?
编辑:我使用 Windows 似乎很重要。
我们正在考虑在新项目中使用git的两种方法:
开发人员向维护者发送补丁(可能最终会成为开发人员之一),他会使用补丁,测试和集成
开发人员将他们的提交推送到公共"开发人员"分支(项目的每个子模块的分支),维护者获取有关推送的邮件通知,并且可以审查\ test\integrate.
最终结果是相同的 - 包含开发人员提交的基于最新的分支.
所以 - 我的问题是,哪个更好?我应该在一个小组中使用非开源项目开发人员吗?(听起来很奇怪,我发送补丁邮件给那个坐在我旁边的人)
我在 git repo 中有一个分支(例如 Feature-X)。
我所做的是以下
git checkout master
git merge Feature-X
Run Code Online (Sandbox Code Playgroud)
我解决了很多冲突。我还没有提交更改。
但是,事实证明我想要的是进行反向合并(即合并 master 到 Feature-x),因为分支可能仍然不稳定。
是否有任何命令可以挽救我在解决冲突时所做的工作,或者我是否需要再次进行解决,这次是在分支 Feature-X 中?
我在想是否有办法获取当前补丁,但以“相反”的顺序将其应用到分支 Feature-X 中。例如,当补丁说行 X 更改为 Y 时,这与 Feature-X 将要掌握有关。如果我想做相反的事情,补丁应该说行 Y 更改为 X,对吗?这只是我的想法。任何解决方案都可以。
git ×12
git-patch ×12
git-add ×2
git-apply ×2
git-rebase ×2
cmd ×1
git-bisect ×1
git-branch ×1
git-commit ×1
git-diff ×1
git-merge ×1
github ×1
npm-scripts ×1
patch ×1
pull-request ×1
windows ×1