Openssl 为什么删除冲突文件会中断项目?

Openssl 为什么删除冲突文件会中断项目?,openssl,git,Openssl,Git,我已经有过三次这样的事情发生在我身上,我想尝试修复它,而不是删除项目并重新克隆它。例如,请参见 我已经通过git clone进行了克隆git://git.openssl.org/openssl.git 今天,我做了一个git pull,但由于文件冲突而失败。为了解决冲突,我执行了以下操作: rm apps/Makefile rm crypto/engine/Makefile rm crypto/evp/Makefile rm ssl/Makefile rm test/Makefile 删除冲突

我已经有过三次这样的事情发生在我身上,我想尝试修复它,而不是删除项目并重新克隆它。例如,请参见

我已经通过git clone进行了克隆git://git.openssl.org/openssl.git

今天,我做了一个git pull,但由于文件冲突而失败。为了解决冲突,我执行了以下操作:

rm apps/Makefile
rm crypto/engine/Makefile
rm crypto/evp/Makefile
rm ssl/Makefile
rm test/Makefile
删除冲突后,
git pull
成功,我尝试构建

现在,这里是我迷路的地方。生成失败,出现重复符号(如下所示)。如果我执行完全的清理和制作(
dclean
是OpenSSL版本的
dist-clean
),它就会失败:

如果我投了一个make depend,它就失败了:

make clean && make dclean && export KERNEL_BITS=64 && ./config && make depend && make
我以为清理后可能会有一些对象文件,但没有:

$ find . -iname *.o
$ 
如果我执行一个新的克隆,那么一切都会按预期进行

导致此问题的
git克隆
git拉动
(使用干净的make)之间的区别是什么

或者git有什么问题,如何解决



因为这在过去发生过多次,我知道这不是一次性的问题

我添加标签是因为它是项目,但我很确定根本的问题是git

我保存了项目而不是删除它,所以我可以对它进行标记并上传以供检查(如果需要)

最后:

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.8.5
BuildVersion:   12F45

下面,
opensslgit
是我的openssl副本所在的位置。它有我的MOD和调整
opensslgit测试
是测试的新克隆。我运行了
查找-名称'*.save'-exec rm-rf{}\在区分之前

$ diff --brief -r openssl-git/ openssl-git-test/
Only in openssl-git/: .DS_Store
Only in openssl-git/.git: FETCH_HEAD
Only in openssl-git/.git: ORIG_HEAD
Files openssl-git/.git/index and openssl-git-test/.git/index differ
Files openssl-git/.git/logs/HEAD and openssl-git-test/.git/logs/HEAD differ
Files openssl-git/.git/logs/refs/heads/master and openssl-git-test/.git/logs/refs/heads/master differ
Files openssl-git/.git/logs/refs/remotes/origin/HEAD and openssl-git-test/.git/logs/refs/remotes/origin/HEAD differ
Only in openssl-git/.git/logs/refs/remotes/origin: OpenSSL_0_9_8-stable
Only in openssl-git/.git/logs/refs/remotes/origin: OpenSSL_1_0_0-stable
Only in openssl-git/.git/logs/refs/remotes/origin: OpenSSL_1_0_1-stable
Only in openssl-git/.git/logs/refs/remotes/origin: OpenSSL_1_0_2-stable
Only in openssl-git/.git/logs/refs/remotes/origin: master
Only in openssl-git/.git/objects: 00
Only in openssl-git/.git/objects: 02
Only in openssl-git/.git/objects: 05
Only in openssl-git/.git/objects: 07
Only in openssl-git/.git/objects: 08
Only in openssl-git/.git/objects: 09
Only in openssl-git/.git/objects: 0a
Only in openssl-git/.git/objects: 0e
Only in openssl-git/.git/objects: 0f
Only in openssl-git/.git/objects: 13
Only in openssl-git/.git/objects: 18
Only in openssl-git/.git/objects: 1b
Only in openssl-git/.git/objects: 1c
Only in openssl-git/.git/objects: 1d
Only in openssl-git/.git/objects: 23
Only in openssl-git/.git/objects: 24
Only in openssl-git/.git/objects: 25
Only in openssl-git/.git/objects: 28
Only in openssl-git/.git/objects: 2a
Only in openssl-git/.git/objects: 2c
Only in openssl-git/.git/objects: 36
Only in openssl-git/.git/objects: 37
Only in openssl-git/.git/objects: 38
Only in openssl-git/.git/objects: 3e
Only in openssl-git/.git/objects: 3f
Only in openssl-git/.git/objects: 42
Only in openssl-git/.git/objects: 44
Only in openssl-git/.git/objects: 4a
Only in openssl-git/.git/objects: 54
Only in openssl-git/.git/objects: 58
Only in openssl-git/.git/objects: 5c
Only in openssl-git/.git/objects: 5d
Only in openssl-git/.git/objects: 60
Only in openssl-git/.git/objects: 61
Only in openssl-git/.git/objects: 63
Only in openssl-git/.git/objects: 66
Only in openssl-git/.git/objects: 67
Only in openssl-git/.git/objects: 68
Only in openssl-git/.git/objects: 6e
Only in openssl-git/.git/objects: 6f
Only in openssl-git/.git/objects: 71
Only in openssl-git/.git/objects: 72
Only in openssl-git/.git/objects: 78
Only in openssl-git/.git/objects: 79
Only in openssl-git/.git/objects: 7b
Only in openssl-git/.git/objects: 80
Only in openssl-git/.git/objects: 82
Only in openssl-git/.git/objects: 84
Only in openssl-git/.git/objects: 87
Only in openssl-git/.git/objects: 88
Only in openssl-git/.git/objects: 8d
Only in openssl-git/.git/objects: 8e
Only in openssl-git/.git/objects: 99
Only in openssl-git/.git/objects: 9f
Only in openssl-git/.git/objects: a0
Only in openssl-git/.git/objects: a3
Only in openssl-git/.git/objects: a4
Only in openssl-git/.git/objects: a8
Only in openssl-git/.git/objects: a9
Only in openssl-git/.git/objects: ae
Only in openssl-git/.git/objects: af
Only in openssl-git/.git/objects: b2
Only in openssl-git/.git/objects: b5
Only in openssl-git/.git/objects: ba
Only in openssl-git/.git/objects: bc
Only in openssl-git/.git/objects: bd
Only in openssl-git/.git/objects: be
Only in openssl-git/.git/objects: c4
Only in openssl-git/.git/objects: c5
Only in openssl-git/.git/objects: c6
Only in openssl-git/.git/objects: d3
Only in openssl-git/.git/objects: d5
Only in openssl-git/.git/objects: d6
Only in openssl-git/.git/objects: d7
Only in openssl-git/.git/objects: da
Only in openssl-git/.git/objects: db
Only in openssl-git/.git/objects: de
Only in openssl-git/.git/objects: e0
Only in openssl-git/.git/objects: e3
Only in openssl-git/.git/objects: e7
Only in openssl-git/.git/objects: e8
Only in openssl-git/.git/objects: e9
Only in openssl-git/.git/objects: ed
Only in openssl-git/.git/objects: ef
Only in openssl-git/.git/objects: f2
Only in openssl-git/.git/objects: fa
Only in openssl-git/.git/objects: fb
Only in openssl-git/.git/objects: fc
Only in openssl-git/.git/objects/pack: pack-663dfba6981c559658fb9253e5456938cd330c97.idx
Only in openssl-git/.git/objects/pack: pack-663dfba6981c559658fb9253e5456938cd330c97.pack
Only in openssl-git-test/.git/objects/pack: pack-97e4b04a1ce519e33653e4f4ef941fed44f53332.idx
Only in openssl-git-test/.git/objects/pack: pack-97e4b04a1ce519e33653e4f4ef941fed44f53332.pack
Only in openssl-git/.git/objects/pack: pack-a5611b625ffa369803ca57e5d198864c4c3933a4.idx
Only in openssl-git/.git/objects/pack: pack-a5611b625ffa369803ca57e5d198864c4c3933a4.pack
Only in openssl-git/.git/objects/pack: pack-feccfacff9cc5bff523280a162d04c2c3813bba8.idx
Only in openssl-git/.git/objects/pack: pack-feccfacff9cc5bff523280a162d04c2c3813bba8.pack
Files openssl-git/.git/packed-refs and openssl-git-test/.git/packed-refs differ
Files openssl-git/.git/refs/heads/master and openssl-git-test/.git/refs/heads/master differ
Only in openssl-git/.git/refs/remotes/origin: OpenSSL_0_9_8-stable
Only in openssl-git/.git/refs/remotes/origin: OpenSSL_1_0_0-stable
Only in openssl-git/.git/refs/remotes/origin: OpenSSL_1_0_1-stable
Only in openssl-git/.git/refs/remotes/origin: OpenSSL_1_0_2-stable
Only in openssl-git/.git/refs/remotes/origin: master
Only in openssl-git/.git/refs/tags: OpenSSL_0_9_8zb
Only in openssl-git/.git/refs/tags: OpenSSL_1_0_0n
Only in openssl-git/.git/refs/tags: OpenSSL_1_0_1i
Files openssl-git/doc/apps/ciphers.pod and openssl-git-test/doc/apps/ciphers.pod differ
Files openssl-git/doc/apps/pkcs8.pod and openssl-git-test/doc/apps/pkcs8.pod differ
Only in openssl-git/engines: e_padlock-x86.s
Only in openssl-git/: s3_enc.c.diff
Files openssl-git/ssl/s3_clnt.c and openssl-git-test/ssl/s3_clnt.c differ
Files openssl-git/ssl/s3_enc.c and openssl-git-test/ssl/s3_enc.c differ
Files openssl-git/ssl/s3_lib.c and openssl-git-test/ssl/s3_lib.c differ
Files openssl-git/ssl/tls1.h and openssl-git-test/ssl/tls1.h differ

我是根据在一些地方发现的一些其他物品猜的,但听起来像:

  • 您正在使用git克隆某些内容,只是为了获得它的某个版本,而您不打算对其进行编辑
  • 您正在克隆的对象在其自身的源代码树中,在其正常操作过程中编辑自身。这对于git,或者实际上对于大多数版本控制系统来说是相当糟糕的。(VCS es的“正确”方法是将可变的、不断变化的、自生成的、非源代码控制的内容保存在一个单独的区域中。这可以像在常规源代码区域中保存单独的文件一样简单,您可以告诉VCS忽略它,就像git的
    .gitignore
    文件一样。)
  • 对于使用svn的人来说,他们可以“作弊”:存储库本身可以存储在那边(想象箭头指向网络),当你正在处理的东西本身进行编辑时,你只需删除东西并要求它再次将它们签出到你的工作树中。所以这最后只能是半可见的。然而,使用git,您会自动将存储库放在这里,因此VCS会看到您已经更改了内容,并坚持要求您在它可以更新任何内容之前强制它放弃您的更改
这个问题有几种(也许很多)解决方案。最好的办法是以上述“正确的方式”对待事情,但这需要另一端的合作。这就留下了几个解决办法:

  • 明确地告诉git:“把我的东西擦干净。”

    reset--hard
    的意思是“擦除所有更改”。(您可能还需要一个
    git clean-fdx
    来删除构建产品。或者,您可以将它们留在那里,只重置git知道的那些文件,即它最初从克隆步骤签出中提取的文件。)确保您是认真的;这没有“哦,等等,我改变主意”选项

    git-fetch&&git-merge
    步骤可以缩写为
    git-pull
    (尽管它们并不完全相同,尤其是在较旧版本的git中)。这是理解这里发生的事情的关键:
    pull
    只是
    fetch
    ,然后是
    merge
    您使用的是
    git checkout
    和git的所有版本控制功能,当您删除文件时,git会得到所有帮助,并坚持要您保存您的工作,因为可以肯定的是,您正试图对自己的更改进行版本控制,并以某种方式将它们与它们融合在一起(“它们”就是您从中获取的对象)

  • 将git的存储库与源代码和构建树分开,就好像根本不使用版本控制系统一样。特别是,您可以使用镜像(或裸克隆)使git“像”SVN。这为您提供了本地存储库,但(至少是镜像存储库)除了从远程版本更新存储库外,您从未接触过:

    git clone --mirror git://whatever... local-clone.git
    
    然后,使用镜像将最新版本提取到空树中:

    cd local-clone; git --work-tree=/somewhere/else checkout master
    
    或:

    (或者,您可以使用
    git--work tree=…reset--hard
    git--git dir=…reset--hard
    将一些文件恢复到原始状态,但您也可以使用第一种方法。)这里的主要优点是,由于git存储库与工作树“足够远”,没有人会意外地尝试使用git在
    /某处/其他地方做工作,认为他们得到了所有常见的git保证

  • 如果您使用
    --mirror
    方法(现在我认为这可能比第一种方法要复杂),请注意
    git fetch
    将直接更新(镜像的)分支。在这种情况下,没有什么可以合并的,事实上,您不能使用镜像保存您自己的更改:当您运行
    git fetch--prune
    (或
    git remote update-p
    )从远程获取新更改时,这些更改将丢失



    1或一些不太容易打印的形容词。:-)

    这个问题在相关问题中得到了回答:

    问题是
    makedclean
    删除了
    test/
    目录(谢谢@hvd)
    dclean
    是OpenSSL与
    distclean
    的等价物。不幸的是,这个项目充满了糟粕和
    dclean之后的
    diff
    git reset --hard && git fetch && git merge
    git clone --mirror git://whatever... local-clone.git
    
    cd local-clone; git --work-tree=/somewhere/else checkout master
    
    cd /somewhere; mkdir else; cd else
    git --git-dir=/path/to/local/clone.git checkout master