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

cuxqih21  于 2023-06-20  发布在  Git
关注(0)|答案(1)|浏览(121)

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

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

编辑:This might be one of the ways to do merging of two files但这并没有多大帮助,我仍然需要手动删除并保留我想要的内容,我想自动化这个过程。我想使用diffsdiff会有帮助吗?但是这些都是交互式的,那么我们如何将其自动化呢?
例如:

    • base. 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)是唯一的,应该包含在输出中,但是basefunc2(a, b)在派生文件中被编辑,因此应该写入输出。基本上在diff中,当derivedbase进行比较时,base中的删除(wrt derived)和derived中的添加(wrt base)应该是输出中的添加,但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

合并到file1的file2 wrt空file3,但我不知道如何删除所有的行从<<<<<<<<========,因为这些将是当前的变化,我想用传入的更改替换,但我也想保持当前文件的唯一的当前更改,同时也保持唯一的传入更改。

b0zn9rqh

b0zn9rqh1#

我写了这个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
它的作用:

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

声明:

  • 我没有做一个完整的try: catch:脚本,它可能会在某些情况下失败。
  • 这段代码只在与脚本相同的目录中的文件上测试过。
  • 我使用了eval,这在某些圈子里是不受欢迎的。这是我发现的将对象名称存储在函数getsource的变量中的唯一方法。
  • 输出文件被覆盖。如果它已经包含了一些东西,它就会丢失。
  • 你可以注解debug print语句,我使用这些来处理代码。

相关问题