繁体   English   中英

如何将 fileA 的更改与 fileB 合并,同时用 fileB 的更改覆盖 fileA 的更改

[英]How to merge the changes of fileA with fileB while also overwriting the changes of fileA with changes in fileB

我有一个用例,我在几个文件中复制相同的代码,所以我想做的是用基本代码创建一个公共文件,而所有其他文件从基本文件和一些文件继承相同的代码。

  • 无论我在派生文件中覆盖什么,都应该在基本文件中覆盖
  • 应包括基本文件的添加
  • 还应包括派生文件的添加

编辑: 这可能是合并两个文件的方法之一,但这并没有太大帮助,我仍然需要手动 go 关于删除和保留我想要的内容,我想自动化这个过程。 我在想使用diffsdiff会有帮助吗? 但这些是交互式的,那么我们如何自动化呢?

例如:

基地.py

def basefunc1(a, b):
    c = a + b
    return c

def basefunc2(a):
    b = a**2
    return b

派生.py

def derivedfunc(a, b):
    c = a + b
    return c

def basefunc2(a, b):
    c = a**b
    return c

output.py

def basefunc1(a, b):
    c = a + b
    return c

def basefunc2(a, b):
    c = a**b
    return c

def derivedfunc(a, b):
    c = a + b
    return c

这里basefunc1(a, b)derivedfunc(a, b)是唯一的,应该包含在output中,但是basefunc2(a, b)是在derived文件中编辑的,所以应该写到output中。基本上在diffderivedbase比较,base 中的删除(wrt derived)和 derived(wrt base)中的添加应该是 output 中的添加,但是 derived(wrt base)中的更改应该被覆盖。

我的方法:

我认为可行的是:

git diff --no-index file1.py file2.py | grep '^+' | sed 's/^+//' | sed '/^++/d'

使用这个我会找到更改的部分,但是我必须这样做两次,因为这只给出了派生文件的添加和更改,第二次将比较这个和基础文件以获得第一个文件。

我也试过

git merge-file file1.py file2.py file3.py

合并到 file2 的 file1 wrt 空 file3,但后来我无法弄清楚如何删除从<<<<<<<<========的所有行,因为这些将是我当前的更改想用传入的更改替换,但我也想保留当前文件的唯一当前更改,同时也保留唯一的传入更改。

我写了这个 python 脚本来做你需要的。 根据您的示例文件,它可以工作。

#!/usr/bin/python3

import importlib
import os
import sys

from inspect import getmembers, isfunction, getsource

if len(sys.argv) < 3:
    print("ERROR: must have 3 arguments.")
    print("       file 1: base file.")
    print("       file 2: derived file.")
    print("       file 3: output file.")
    exit
else:
    # files to process
    file1 = str(sys.argv[1])
    file2 = str(sys.argv[2])
    outfile = str(sys.argv[3])

    # import sees packages without the extension
    modulename1 = os.path.splitext(file1)[0]
    modulename2 = os.path.splitext(file2)[0]

    # load both modules
    module1 = importlib.import_module(modulename1, package=None)
    module2 = importlib.import_module(modulename2, package=None)

    # get a set of functions in file1
    functions1 = getmembers(module1, isfunction)
    functionsset1 = set([i[0] for i in functions1])
    print(functionsset1)
    # {'basefunc1', 'basefunc2'}

    # get a set of functions in file2
    functions2 = getmembers(module2, isfunction)
    functionsset2 = set([i[0] for i in functions2])
    print(functionsset2)
    # {'basefunc2','derivedfunc'}

    # Empty the output file
    open(outfile, 'w').close()

    # Write the functions into the outfile
    with open(outfile, "a") as outputfile:

        # 1- functions only in file1
        #    print these directly to the output file
        functionsdifflist1 = list(functionsset1.difference(functionsset2))
        print(functionsdifflist1)
        for f in functionsdifflist1:
            objectname = 'module1.' + str(f)
            outputfile.write(getsource(eval(str(objectname))))

        # 2- functions only in file2
        #    print these directly to the output file
        functionsdifflist2 = list(functionsset2.difference(functionsset1))
        print(functionsdifflist2)
        for f in functionsdifflist2:
            objectname = 'module2.' + str(f)
            outputfile.write(getsource(eval(str(objectname))))

        # 3- functions present in both
        #    print the version from file2
        functionsintersectlist = list(functionsset1.intersection(functionsset2))
        print(functionsintersectlist)
        # basefunc2
        for f in functionsintersectlist:
            objectname = 'module2.' + str(f)
            outputfile.write(getsource(eval(str(objectname))))

使用方法: ./script.py base.py derived.py output.py

它能做什么:

  • 从 base.py 加载函数
  • 从 derived.py 加载函数
  • 从 base.py 构建一组所有函数
  • 从 derived.py 构建一组所有函数
  • 使用集合函数计算差值和交集
  • base.py 中的函数直接发送到 output.py
  • derived.py 中的函数直接发送到 output.py
  • 对于两者中的函数,从 derived.py 获取版本

免责声明:

  • 我没有做完整的try: catch:脚本,在某些情况下它可能会失败。
  • 此代码仅使用与脚本位于同一目录中的文件进行测试。
  • 我使用了在某些圈子里不受欢迎的eval 这是我发现将 object 的名称存储在 function getsource的变量中的唯一方法。
  • output 文件被覆盖。 如果它已经包含某些东西,它将丢失。
  • 你可以评论调试print语句,我用它们来处理代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM