我有一个subversion存储库,它有8个修订版,在7到8之间有很多很多变化。如何为7到8之间的变化创建每个文件的补丁文件?
I.E。,不是一个庞大的补丁文件,但如果x.php发生变化并且y.php发生了变化,我想要一个x.php补丁文件和y.php
这可能吗?我该怎么办?
答案 0 :(得分:2)
你需要某种脚本来获取文件名列表并为每个文件名请求补丁,或者请求“大量”补丁并将其拆分为---
行......
答案 1 :(得分:0)
我知道可以使用InstallShield等工具。 InstallShield会找出两个版本之间的差异,并写出仅包含差异的补丁程序安装程序。因此,好像这是安装程序创建工具的属性。
答案 2 :(得分:0)
这是一个简单的winforms应用程序,它将在C#中完成拆分。它需要三个按钮:btnIn
,btnFolder
,btnSplit
和两个标签,lblIn
,lblFolder
。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace PatchSplitter {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void btnIn_Click(object sender, EventArgs e) {
OpenFileDialog ofd = new OpenFileDialog();
if(ofd.ShowDialog() == DialogResult.OK) {
lblIn.Text = ofd.FileName;
if(lblIn.Text != "" && lblFolder.Text != "") {
btnSplit.Enabled = true;
} else {
btnSplit.Enabled = false;
}
}
}
private void btnFolder_Click(object sender, EventArgs e) {
FolderBrowserDialog fbd = new FolderBrowserDialog();
if(fbd.ShowDialog() == DialogResult.OK) {
lblFolder.Text = fbd.SelectedPath;
if (lblIn.Text != "" && lblFolder.Text != "") {
btnSplit.Enabled = true;
} else {
btnSplit.Enabled = false;
}
}
}
private void btnSplit_Click(object sender, EventArgs e) {
string file = "";
string line;
StreamWriter current = null;
StreamReader input = new StreamReader(lblIn.Text);
while ((line = input.ReadLine()) != null) {
if (line.StartsWith("Index: ")) {
if (current != null) {
current.Close();
}
file = line.Remove(0, 7);
string directory;
if (file.LastIndexOf('/') == -1) {
directory = "";
} else {
directory = file.Substring(0, file.LastIndexOf('/'));
}
if (!Directory.Exists(lblFolder.Text + "\\" + directory)) {
Directory.CreateDirectory(lblFolder.Text + "\\" + directory);
}
current = new StreamWriter(new FileStream(lblFolder.Text + "\\" + file + ".patch", FileMode.Create));
current.WriteLine(line);
} else {
if (current != null) {
current.WriteLine(line);
}
}
}
current.Close();
MessageBox.Show("Done");
}
}
}