6

这将是一个长的,但我希望你能忍受我。

我正在尝试使用 git 将我团队的源代码置于版本控制之下。在尝试找到适合我的不同方法后,我最终决定使用git format-patch功能。FWIW,该产品是在 Windows 中运行的 ASP.NET Web 应用程序,我目前正在使用msysgit

背景:
我有一个包含所有 aspx 文件的登台服务器(镜像生产服务器)。然后我在我的根文件夹中使用init-db创建了一个 git repo并git add .跟踪所有文件。

为了让我在我的笔记本电脑上有一个本地副本,我实际上从登台服务器上压缩了“.git”文件夹并将其通过 FTP 传输到我的本地计算机。将其重命名为“staging.git”并git clone staging.git webappfolder针对我的开发做了一个。

在为 feature1 和 feature2 做了 2 次提交之后,是时候将更改应用回登台服务器了。我做了一个git format-patch -2输出到文件0001blah.patch0002blah.patch.

然后将这两个补丁文件发送到登台服务器,我git am 0001blah.patch在登台服务器本身上做了一个。做一个git log展示提交经过。但是当我做一个git status,它显示Changed but not updated: modified: file1.aspx

这到底是什么意思?我也尝试过做 agit apply 0001blah.patch但我得到的只是一个error" patch failed: file1.aspx: patch does not apply.

我的工作流程有问题吗?有关正确方法或帮助的任何见解都将非常有帮助。同样,修补模型现在对我们来说是最可行的,因为我们不会很快设置 SSH 服务器。

4

2 回答 2

5

我刚试过这个:

rm -rf clone?

# clone 1 is the working copy
mkdir clone1
(
    cd clone1
    git init
    echo foo >> file1
    git add file1
    git commit -m "Initial state"
)

# clone 2 is the staging repo
git clone clone1 clone2

# create patches
(
    cd clone1
    git tag staging # tag to track what's in staging

    echo feature1 >> file1
    git add file1
    git commit -m "Feature 1"

    echo feature2 >> file1
    git add file1
    git commit -m "Feature 2"

    rm *.patch
    git format-patch staging
)

# apply patches
(
    cd clone2
    git am ../clone1/*.patch
    # Cygwin/msysgit line ending weirdness when patching. Aborting and
    # reapplying clears it up.
    git am --abort 
    git am ../clone1/*.patch
    git log
    git status
)

如果不执行两次 am ,补丁没有明确应用,但我最终在克隆 2 中得到了一个干净的工作目录,文件 1 的内容正确。因此,您的工作流程本身似乎没有任何问题。

Git apply 只会更新工作树,不会执行提交。

也就是说,我不会使用 git 存储库进行暂存。我的工作流程可能会创建(或不)开发存储库的发布分支/分支,并且只需部署完整的干净副本。

对于暂存环境的增量更新,只需git tag staging在发布分支中使用“git diff staging..HEAD > update.patch”到电子邮件,标准的 unix “patch -p1”应用它应该可以工作。那是除非您真的需要在登台服务器上实际拥有更改历史记录。

于 2009-04-28T13:23:37.150 回答
3

你试过一个

git am -3 

? 从git-am 文档

-3
--3way

When the patch does not apply cleanly, fall back on 3-way merge

注意:从Git Google Summer of Code 2009中,有一个项目“教 git-apply the 3-way merge fallback git-am know”:

git-apply修补文件时,文件可能无法干净地修补。在这种情况下,git-apply当前拒绝补丁。
如果从那里调用它,git-am则尝试通过以下方式进行 3 路合并:

  • 从补丁中获取“index ...”数据并
  • 构建一棵临时树,
  • 应用补丁,然后
  • 将临时树合并到当前分支。

由于各种原因,最好直接在 git-apply 内部进行整个临时树舞,因为它可以说 git-sequence 的“应用”命令,通过减少分叉来加速 git-am 处理等

于 2009-04-28T13:11:04.010 回答