本文整理汇总了C#中Repository.Merge方法的典型用法代码示例。如果您正苦于以下问题:C# Repository.Merge方法的具体用法?C# Repository.Merge怎么用?C# Repository.Merge使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Repository
的用法示例。
在下文中一共展示了Repository.Merge方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CanFollowFirstParent
public void CanFollowFirstParent()
{
string path = SandboxStandardTestRepo();
using (var repo = new Repository(path))
{
var branch = repo.CreateBranch("branch");
// Make an earlier tag on master
repo.Commit("A", Constants.Signature, Constants.Signature, new CommitOptions { AllowEmptyCommit = true });
repo.ApplyTag("firstParentTag");
// Make a later tag on branch
Commands.Checkout(repo, branch);
repo.Commit("B", Constants.Signature, Constants.Signature, new CommitOptions { AllowEmptyCommit = true });
repo.ApplyTag("mostRecentTag");
Commands.Checkout(repo, "master");
repo.Commit("C", Constants.Signature, Constants.Signature, new CommitOptions { AllowEmptyCommit = true });
repo.Merge(branch, Constants.Signature, new MergeOptions() { FastForwardStrategy = FastForwardStrategy.NoFastForward });
// With OnlyFollowFirstParent = false, the most recent tag reachable should be returned
Assert.Equal("mostRecentTag-3-gf17be71", repo.Describe(repo.Head.Tip, new DescribeOptions { OnlyFollowFirstParent = false, Strategy = DescribeStrategy.Tags }));
// With OnlyFollowFirstParent = true, the most recent tag on the current branch should be returned
Assert.Equal("firstParentTag-2-gf17be71", repo.Describe(repo.Head.Tip, new DescribeOptions { OnlyFollowFirstParent = true, Strategy = DescribeStrategy.Tags }));
}
}
示例2: CanFastForwardRepos
public void CanFastForwardRepos(bool shouldMergeOccurInDetachedHeadState)
{
const string firstBranchFileName = "first branch file.txt";
const string sharedBranchFileName = "first+second branch file.txt";
string path = CloneStandardTestRepo();
using (var repo = new Repository(path))
{
// Reset the index and the working tree.
repo.Reset(ResetMode.Hard);
// Clean the working directory.
repo.RemoveUntrackedFiles();
var firstBranch = repo.CreateBranch("FirstBranch");
firstBranch.Checkout();
// Commit with ONE new file to both first & second branch (SecondBranch is created on this commit).
AddFileCommitToRepo(repo, sharedBranchFileName);
var secondBranch = repo.CreateBranch("SecondBranch");
// Commit with ONE new file to first branch (FirstBranch moves forward as it is checked out, SecondBranch stays back one).
AddFileCommitToRepo(repo, firstBranchFileName);
if (shouldMergeOccurInDetachedHeadState)
{
// Detaches HEAD
repo.Checkout(secondBranch.Tip);
}
else
{
secondBranch.Checkout();
}
Assert.Equal(shouldMergeOccurInDetachedHeadState, repo.Info.IsHeadDetached);
MergeResult mergeResult = repo.Merge(repo.Branches["FirstBranch"].Tip, Constants.Signature);
Assert.Equal(MergeStatus.FastForward, mergeResult.Status);
Assert.Equal(repo.Branches["FirstBranch"].Tip, mergeResult.Commit);
Assert.Equal(repo.Branches["FirstBranch"].Tip, repo.Head.Tip);
Assert.Equal(repo.Head.Tip, mergeResult.Commit);
Assert.Equal(0, repo.Index.RetrieveStatus().Count());
Assert.Equal(shouldMergeOccurInDetachedHeadState, repo.Info.IsHeadDetached);
if (!shouldMergeOccurInDetachedHeadState)
{
// Ensure HEAD is still attached and points to SecondBranch
Assert.Equal(repo.Refs.Head.TargetIdentifier, secondBranch.CanonicalName);
}
}
}
示例3: CanFailOnFirstMergeConflict
public void CanFailOnFirstMergeConflict()
{
string path = SandboxMergeTestRepo();
using (var repo = new Repository(path))
{
var mergeResult = repo.Merge("conflicts", Constants.Signature, new MergeOptions() { FailOnConflict = true, });
Assert.Equal(MergeStatus.Conflicts, mergeResult.Status);
var master = repo.Branches["master"];
var branch = repo.Branches["conflicts"];
var mergeTreeResult = repo.ObjectDatabase.MergeCommits(master.Tip, branch.Tip, new MergeTreeOptions() { FailOnConflict = true });
Assert.Equal(MergeTreeStatus.Conflicts, mergeTreeResult.Status);
Assert.Empty(mergeTreeResult.Conflicts);
}
}
示例4: CanFastForwardCommit
public void CanFastForwardCommit(bool fromDetachedHead, FastForwardStrategy fastForwardStrategy, string expectedCommitId, MergeStatus expectedMergeStatus)
{
string path = CloneMergeTestRepo();
using (var repo = new Repository(path))
{
if(fromDetachedHead)
{
repo.Checkout(repo.Head.Tip.Id.Sha);
}
Commit commitToMerge = repo.Branches["fast_forward"].Tip;
MergeResult result = repo.Merge(commitToMerge, Constants.Signature, new MergeOptions() { FastForwardStrategy = fastForwardStrategy });
Assert.Equal(expectedMergeStatus, result.Status);
Assert.Equal(expectedCommitId, result.Commit.Id.Sha);
Assert.False(repo.Index.RetrieveStatus().Any());
Assert.Equal(fromDetachedHead, repo.Info.IsHeadDetached);
}
}
示例5: CanSpecifyConflictFileStrategy
public void CanSpecifyConflictFileStrategy(CheckoutFileConflictStrategy conflictStrategy)
{
const string conflictFile = "a.txt";
const string conflictBranchName = "conflicts";
string path = CloneMergeTestRepo();
using (var repo = new Repository(path))
{
Branch branch = repo.Branches[conflictBranchName];
Assert.NotNull(branch);
MergeOptions mergeOptions = new MergeOptions()
{
FileConflictStrategy = conflictStrategy,
};
MergeResult result = repo.Merge(branch, Constants.Signature, mergeOptions);
Assert.Equal(MergeStatus.Conflicts, result.Status);
// Get the information on the conflict.
Conflict conflict = repo.Index.Conflicts[conflictFile];
Assert.NotNull(conflict);
Assert.NotNull(conflict.Theirs);
Assert.NotNull(conflict.Ours);
// Get the blob containing the expected content.
Blob expectedBlob = null;
switch(conflictStrategy)
{
case CheckoutFileConflictStrategy.Theirs:
expectedBlob = repo.Lookup<Blob>(conflict.Theirs.Id);
break;
case CheckoutFileConflictStrategy.Ours:
expectedBlob = repo.Lookup<Blob>(conflict.Ours.Id);
break;
default:
throw new Exception("Unexpected FileConflictStrategy");
}
Assert.NotNull(expectedBlob);
// Check the content of the file on disk matches what is expected.
string expectedContent = expectedBlob.GetContentText(new FilteringOptions(conflictFile));
Assert.Equal(expectedContent, File.ReadAllText(Path.Combine(repo.Info.WorkingDirectory, conflictFile)));
}
}
示例6: CanMergeRepoNonFastForward
public void CanMergeRepoNonFastForward(bool shouldMergeOccurInDetachedHeadState)
{
const string firstBranchFileName = "first branch file.txt";
const string secondBranchFileName = "second branch file.txt";
const string sharedBranchFileName = "first+second branch file.txt";
string path = CloneStandardTestRepo();
using (var repo = new Repository(path))
{
var firstBranch = repo.CreateBranch("FirstBranch");
firstBranch.Checkout();
var originalTreeCount = firstBranch.Tip.Tree.Count;
// Commit with ONE new file to both first & second branch (SecondBranch is created on this commit).
AddFileCommitToRepo(repo, sharedBranchFileName);
var secondBranch = repo.CreateBranch("SecondBranch");
// Commit with ONE new file to first branch (FirstBranch moves forward as it is checked out, SecondBranch stays back one).
AddFileCommitToRepo(repo, firstBranchFileName);
if (shouldMergeOccurInDetachedHeadState)
{
// Detaches HEAD
repo.Checkout(secondBranch.Tip);
}
else
{
secondBranch.Checkout();
}
// Commit with ONE new file to second branch (FirstBranch and SecondBranch now point to separate commits that both have the same parent commit).
AddFileCommitToRepo(repo, secondBranchFileName);
MergeResult mergeResult = repo.Merge(repo.Branches["FirstBranch"].Tip, Constants.Signature);
Assert.Equal(MergeStatus.NonFastForward, mergeResult.Status);
Assert.Equal(repo.Head.Tip, mergeResult.Commit);
Assert.Equal(originalTreeCount + 3, mergeResult.Commit.Tree.Count); // Expecting original tree count plussed by the 3 added files.
Assert.Equal(2, mergeResult.Commit.Parents.Count()); // Merge commit should have 2 parents
Assert.Equal(shouldMergeOccurInDetachedHeadState, repo.Info.IsHeadDetached);
if (!shouldMergeOccurInDetachedHeadState)
{
// Ensure HEAD is still attached and points to SecondBranch
Assert.Equal(repo.Refs.Head.TargetIdentifier, secondBranch.CanonicalName);
}
}
}
示例7: CanMergeIntoOrphanedBranch
public void CanMergeIntoOrphanedBranch()
{
string path = CloneMergeTestRepo();
using (var repo = new Repository(path))
{
repo.Refs.Add("HEAD", "refs/heads/orphan", true);
// Remove entries from the working directory
foreach(var entry in repo.Index.RetrieveStatus())
{
repo.Index.Unstage(entry.FilePath);
repo.Index.Remove(entry.FilePath, true);
}
// Assert that we have an empty working directory.
Assert.False(repo.Index.RetrieveStatus().Any());
MergeResult result = repo.Merge("master", Constants.Signature);
Assert.Equal(MergeStatus.FastForward, result.Status);
Assert.Equal(masterBranchInitialId, result.Commit.Id.Sha);
Assert.False(repo.Index.RetrieveStatus().Any());
}
}
示例8: MergeReportsCheckoutProgress
public void MergeReportsCheckoutProgress()
{
string repoPath = CloneMergeTestRepo();
using (var repo = new Repository(repoPath))
{
Commit commitToMerge = repo.Branches["normal_merge"].Tip;
bool wasCalled = false;
MergeOptions options = new MergeOptions()
{
OnCheckoutProgress = (path, completed, total) => wasCalled = true,
};
MergeResult result = repo.Merge(commitToMerge, Constants.Signature, options);
Assert.True(wasCalled);
}
}
示例9: MergeCanDetectRenames
public void MergeCanDetectRenames()
{
// The environment is set up such that:
// file b.txt is edited in the "rename" branch and
// edited and renamed in the "rename_source" branch.
// The edits are automergable.
// We can rename "rename_source" into "rename"
// if rename detection is enabled,
// but the merge will fail with conflicts if this
// change is not detected as a rename.
string repoPath = CloneMergeTestRepo();
using (var repo = new Repository(repoPath))
{
Branch currentBranch = repo.Checkout("rename_source");
Assert.NotNull(currentBranch);
Branch branchToMerge = repo.Branches["rename"];
MergeResult result = repo.Merge(branchToMerge, Constants.Signature);
Assert.Equal(MergeStatus.NonFastForward, result.Status);
}
}
示例10: CanMergeBranch
public void CanMergeBranch(string branchName, FastForwardStrategy strategy, MergeStatus expectedMergeStatus)
{
string path = SandboxMergeTestRepo();
using (var repo = new Repository(path))
{
Branch branch = repo. Branches[branchName];
MergeResult result = repo.Merge(branch, Constants.Signature, new MergeOptions() { FastForwardStrategy = strategy });
Assert.Equal(expectedMergeStatus, result.Status);
Assert.False(repo.RetrieveStatus().Any());
}
}
示例11: MergeWithWorkDirConflictsThrows
public void MergeWithWorkDirConflictsThrows(bool shouldStage, FastForwardStrategy strategy)
{
// Merging the fast_forward branch results in a change to file
// b.txt. In this test we modify the file in the working directory
// and then attempt to perform a merge. We expect the merge to fail
// due to merge conflicts.
string committishToMerge = "fast_forward";
using (var repo = new Repository(SandboxMergeTestRepo()))
{
Touch(repo.Info.WorkingDirectory, "b.txt", "this is an alternate change");
if (shouldStage)
{
repo.Stage("b.txt");
}
Assert.Throws<MergeConflictException>(() => repo.Merge(committishToMerge, Constants.Signature, new MergeOptions() { FastForwardStrategy = strategy }));
}
}
示例12: CanForceNonFastForwardMerge
public void CanForceNonFastForwardMerge()
{
string path = SandboxMergeTestRepo();
using (var repo = new Repository(path))
{
Commit commitToMerge = repo.Branches["fast_forward"].Tip;
MergeResult result = repo.Merge(commitToMerge, Constants.Signature, new MergeOptions() { FastForwardStrategy = FastForwardStrategy.NoFastFoward });
Assert.Equal(MergeStatus.NonFastForward, result.Status);
Assert.Equal("f58f780d5a0ae392efd4a924450b1bbdc0577d32", result.Commit.Id.Sha);
Assert.False(repo.RetrieveStatus().Any());
}
}
示例13: MergeCanSpecifyMergeFileFavorOption
public void MergeCanSpecifyMergeFileFavorOption(MergeFileFavor fileFavorFlag)
{
const string conflictFile = "a.txt";
const string conflictBranchName = "conflicts";
string path = SandboxMergeTestRepo();
using (var repo = new Repository(path))
{
Branch branch = repo.Branches[conflictBranchName];
Assert.NotNull(branch);
MergeOptions mergeOptions = new MergeOptions()
{
MergeFileFavor = fileFavorFlag,
};
MergeResult result = repo.Merge(branch, Constants.Signature, mergeOptions);
Assert.Equal(MergeStatus.NonFastForward, result.Status);
// Verify that the index and working directory are clean
Assert.True(repo.Index.IsFullyMerged);
Assert.False(repo.RetrieveStatus().IsDirty);
// Get the blob containing the expected content.
Blob expectedBlob = null;
switch (fileFavorFlag)
{
case MergeFileFavor.Theirs:
expectedBlob = repo.Lookup<Blob>("3dd9738af654bbf1c363f6c3bbc323bacdefa179");
break;
case MergeFileFavor.Ours:
expectedBlob = repo.Lookup<Blob>("610b16886ca829cebd2767d9196f3c4378fe60b5");
break;
default:
throw new Exception("Unexpected MergeFileFavor");
}
Assert.NotNull(expectedBlob);
// Verify the index has the expected contents
IndexEntry entry = repo.Index[conflictFile];
Assert.NotNull(entry);
Assert.Equal(expectedBlob.Id, entry.Id);
// Verify the content of the file on disk matches what is expected.
string expectedContent = expectedBlob.GetContentText(new FilteringOptions(conflictFile));
Assert.Equal(expectedContent, File.ReadAllText(Path.Combine(repo.Info.WorkingDirectory, conflictFile)));
}
}
示例14: FastForwardMergeReportsCheckoutProgress
public void FastForwardMergeReportsCheckoutProgress()
{
string repoPath = SandboxMergeTestRepo();
using (var repo = new Repository(repoPath))
{
Commit commitToMerge = repo.Branches["fast_forward"].Tip;
bool wasCalled = false;
MergeOptions options = new MergeOptions()
{
OnCheckoutProgress = (path, completed, total) => wasCalled = true,
};
repo.Merge(commitToMerge, Constants.Signature, options);
Assert.True(wasCalled);
}
}
示例15: ConflictingMergeReposBinary
public void ConflictingMergeReposBinary()
{
const string firstBranchFileName = "first branch file.bin";
const string secondBranchFileName = "second branch file.bin";
const string sharedBranchFileName = "first+second branch file.bin";
string path = CloneStandardTestRepo();
using (var repo = new Repository(path))
{
var firstBranch = repo.CreateBranch("FirstBranch");
firstBranch.Checkout();
// Commit with ONE new file to both first & second branch (SecondBranch is created on this commit).
AddFileCommitToRepo(repo, sharedBranchFileName);
var secondBranch = repo.CreateBranch("SecondBranch");
// Commit with ONE new file to first branch (FirstBranch moves forward as it is checked out, SecondBranch stays back one).
AddFileCommitToRepo(repo, firstBranchFileName);
AddFileCommitToRepo(repo, sharedBranchFileName, "\0The first branches comment\0"); // Change file in first branch
secondBranch.Checkout();
// Commit with ONE new file to second branch (FirstBranch and SecondBranch now point to separate commits that both have the same parent commit).
AddFileCommitToRepo(repo, secondBranchFileName);
AddFileCommitToRepo(repo, sharedBranchFileName, "\0The second branches comment\0"); // Change file in second branch
MergeResult mergeResult = repo.Merge(repo.Branches["FirstBranch"].Tip, Constants.Signature);
Assert.Equal(MergeStatus.Conflicts, mergeResult.Status);
Assert.Equal(1, repo.Index.Conflicts.Count());
Conflict conflict = repo.Index.Conflicts.First();
var changes = repo.Diff.Compare(repo.Lookup<Blob>(conflict.Theirs.Id), repo.Lookup<Blob>(conflict.Ours.Id));
Assert.True(changes.IsBinaryComparison);
}
}