Merging with Renku

I was running different model cases on renkulab and locally. Previously, I could do so, and then merge the two model results. Usually, there was just a merge conflict in .gitattributes, which I could easily solve. Now, I got more merge conflicts in renku files:

remote: Enumerating objects: 569, done.
remote: Counting objects: 100% (569/569), done.
remote: Compressing objects: 100% (349/349), done.
remote: Total 495 (delta 160), reused 309 (delta 87), pack-reused 0
Receiving objects: 100% (495/495), 97.71 KiB | 24.00 KiB/s, done.
Resolving deltas: 100% (160/160), completed with 24 local objects.
From renkulab.io:remko.nijzink/vom-sens-crv
   19fc84b..261da5a  master     -> origin/master
Filtering content: 100% (108/108), 2.83 GiB | 36.83 MiB/s, done.
warning: Cannot merge binary files: .renku/metadata/7f/f1/7ff1161310494190bbcd93ed1f450889e2a63892e81e443d9fcd303b276dcc68 (HEAD vs. 261da5abc96e147703d809c2da7d169a1fd97095)
warning: Cannot merge binary files: .renku/metadata/42/33/42339961a8844b36b9974d4d25560e93a3a7c3acff2a4c02923f31bead917bdb (HEAD vs. 261da5abc96e147703d809c2da7d169a1fd97095)
Auto-merging .renku/metadata/plans-by-name
CONFLICT (content): Merge conflict in .renku/metadata/plans-by-name
Auto-merging .renku/metadata/plans
CONFLICT (content): Merge conflict in .renku/metadata/plans
Auto-merging .renku/metadata/activities-by-usage
CONFLICT (content): Merge conflict in .renku/metadata/activities-by-usage
Auto-merging .renku/metadata/activities-by-generation
CONFLICT (content): Merge conflict in .renku/metadata/activities-by-generation
Auto-merging .renku/metadata/activities
CONFLICT (content): Merge conflict in .renku/metadata/activities
Auto-merging .renku/metadata/7f/f1/7ff1161310494190bbcd93ed1f450889e2a63892e81e443d9fcd303b276dcc68
CONFLICT (content): Merge conflict in .renku/metadata/7f/f1/7ff1161310494190bbcd93ed1f450889e2a63892e81e443d9fcd303b276dcc68
Auto-merging .renku/metadata/42/33/42339961a8844b36b9974d4d25560e93a3a7c3acff2a4c02923f31bead917bdb
CONFLICT (content): Merge conflict in .renku/metadata/42/33/42339961a8844b36b9974d4d25560e93a3a7c3acff2a4c02923f31bead917bdb
Automatic merge failed; fix conflicts and then commit the result.

What is the best way to have simultaneous tasks in one repository, without causing conflicts?

We’re currently implementing add a custom git mergetool for our metadata · Issue #2846 · SwissDataScienceCenter/renku-python · GitHub which adds a git mergetool that can automatically merge Renku metadata, which would mean you could continue working as usual and git merge should just work.

I’m not sure when this will be released, it should be finished in 2-3 days but might not make it into the renku-python release this Friday. Most of the functionality is there but it still needs a lot of testing.

But I should be able to quickly write up a custom mergetool bash script that should already help, I’ll post it later. Do you use a visual merge tool when merging files or how do you usually merge them?

Okay, that would be great! I do not use a visual merge tool, but usually do it on the command line. Or, more specific, I usually pull, and when there are merge conflicts I try to just have a look at the file and edit it in the way I want. But I think a bash script should be really helpful!

DISCLAIMER: The following is a pretty dumb/simple version of a merge tool for renku metadata. Do not use this if you’re not comfortable with resolving merge conflicts in JSON structure, as resolving a merge conflict the wrong way can mess up your metadata and corrupt the project. The approach outlined here entails modifying the bare-bones data used by renku and is quite technical.

For this to work you need to have zstd and jq installed

You can create a script merge.sh somewhere with this:

#!/bin/bash

base=$1
local=$2
remote=$3

function cleanup {
    echo "trap cleanup"
    rm -f ${base}.raw ${local}.raw ${remote}.raw ${base}.raw_pretty ${local}.raw_pretty ${remote}.raw_pretty
}

trap cleanup EXIT

echo "unzstd first"
unzstd -q $base -o $base.raw || cp $base $base.raw
echo "unzstd second"
text=false

if ! unzstd -q $local -o $local.raw ; then
    text=true
    cp $local $local.raw
fi

echo "unzstd third"
unzstd -q $remote -o $remote.raw || cp $remote $remote.raw

echo "pretty formatting"
jq . $base.raw > $base.raw_pretty
jq . $local.raw > $local.raw_pretty
jq . $remote.raw > $remote.raw_pretty

echo "merging"
git merge-file $local.raw_pretty $base.raw_pretty $remote.raw_pretty
exit_code=$?

if [ $exit_code -ne 0 ]; then
    ${EDITOR:-nano} $local.raw_pretty
fi

echo "compressing"
echo "$text $local"

if $text ; then
    mv -f $local.raw_pretty $local
else
    cat $local.raw_pretty | zstd -q -f -o $local
fi

echo "done"
(exit $exit_code)

then in your project you modify and commit .gitattributes so it contains (this tells git to use the custom mergetool for renku metadata files)

.renku/metadata/*       merge=zstdmerge
.renku/metadata/**/*    merge=zstdmerge

and edit .git/config in the project to contain (replace <path> with the path to merge.sh)

[merge "zstdmerge"]
        name = ZSTD merge
        driver = bash <path>/merge.sh %O %A %B
        trustExitCode = true

Renku stores it’s metadata as compressed JSON, using zstd to compress the files. This mergetool is pretty dumb, all it does is uncompress & pretty-print the JSON, call git merge-file on it, open the local editor configure in $EDITOR if there was a conflict and then re-compress the result.

git merge-file is the normal git merge functionality, so it’s not that smart and conflicts are likely.

The conflicts will probably look like this:

[...]
           "@renku_data_value": [
              {
                "@renku_data_type": "builtins.tuple",
                "@renku_data_value": [
<<<<<<< .merge_file_Nl9gh4.raw_pretty
                  "/plans/2298293d971343348c88726313f108f5",
                  {
                    "@renku_data_type": "renku.domain_model.workflow.plan.Plan",
                    "@renku_oid": "7bf93af86204a1602d8eafad579b429ee7eed6cf0660217f33f51c1a62cd8a2b",
                    "@renku_reference": true
                  },
                  "/plans/f6d1d794e98b4d74b7a98c1dbd840c8c",
                  {
                    "@renku_data_type": "renku.domain_model.workflow.plan.Plan",
                    "@renku_oid": "307ecbd3ddc6d6211672ec2a71c2c9cfb1e872ca3b5b55707196a7a9b07d516b",
=======
                  "/plans/a6ca0683be6048299db22b38b5aa0893",
                  {
                    "@renku_data_type": "renku.domain_model.workflow.plan.Plan",
                    "@renku_oid": "49f68b42d9dc81c4c5f5af6279f64d36d15811dc8a99e79851b102a37368f997",
                    "@renku_reference": true
                  },
                  "/plans/bb1da60fc13c4a3b9a5564cc37ea6531",
                  {
                    "@renku_data_type": "renku.domain_model.workflow.plan.Plan",
                    "@renku_oid": "d6115a28ad9a631debae609ccef2c9f897711192d4747392af050c81e4b3739f",
>>>>>>> .merge_file_rGN62b.raw_pretty
                    "@renku_reference": true
                  }
                ]
[...]

and a correct merge would look like

[...]
           "@renku_data_value": [
              {
                "@renku_data_type": "builtins.tuple",
                "@renku_data_value": [
                  "/plans/2298293d971343348c88726313f108f5",
                  {
                    "@renku_data_type": "renku.domain_model.workflow.plan.Plan",
                    "@renku_oid": "7bf93af86204a1602d8eafad579b429ee7eed6cf0660217f33f51c1a62cd8a2b",
                    "@renku_reference": true
                  },
                  "/plans/f6d1d794e98b4d74b7a98c1dbd840c8c",
                  {
                    "@renku_data_type": "renku.domain_model.workflow.plan.Plan",
                    "@renku_oid": "307ecbd3ddc6d6211672ec2a71c2c9cfb1e872ca3b5b55707196a7a9b07d516b",
                    "@renku_reference": true
                  },
                  "/plans/a6ca0683be6048299db22b38b5aa0893",
                  {
                    "@renku_data_type": "renku.domain_model.workflow.plan.Plan",
                    "@renku_oid": "49f68b42d9dc81c4c5f5af6279f64d36d15811dc8a99e79851b102a37368f997",
                    "@renku_reference": true
                  },
                  "/plans/bb1da60fc13c4a3b9a5564cc37ea6531",
                  {
                    "@renku_data_type": "renku.domain_model.workflow.plan.Plan",
                    "@renku_oid": "d6115a28ad9a631debae609ccef2c9f897711192d4747392af050c81e4b3739f",
                    "@renku_reference": true
                  }
                ]
[...]

Note that git does not see the

                    "@renku_reference": true
                  },

part at the end as a conflict, so I had to copy/duplicate that to the middle for the merge to be valid.
The structure is always string followed by dictionary, repeating. There are database indices pointing to the workflows, the workflows themselves shouldn’t have conflicts as they end up in different files.

There’s probably around 5 conflicts of you just execute two workflows in parallel, more if there are more workflows on the different branches.

I would highly recommend running renku log and renku workflow visualize <some_output_file_of_a_merged_workflow> to verify that metadata is intact after the merge (and renku dataset show if a dataset was modified).

This is rather cumbersome and definitely not something I’d recommend doing long-term. The custom mergetool we are implementing at the moment is much smarter than this and understands the metadata and can deduce how to properly merge things. And it will guide the user in case of a conflict. So I hope we can release that soon.

I hope this helps. Let me know if you have any questions

The alternative would be to install renku from GitHub - SwissDataScienceCenter/renku-python at feature/2846-custom-mergetool and run renku mergetool install in your project.

That would install the work-in-progress mergetool I’m working on, which in my tests works well for workflows, datasets, project metadata and seems stable. But that’d be very experimental and I couldn’t guarantee that it doesn’t mess up at this point. So only use this if you can accept the risks and definitely verify that the merge didn’t corrupt data with renku log and renku workflow visualize as mentioned above. And right now it’s probably best if you don’t create any actual conflicts (like creating workflows with the same name in both branches).

Okay, thank you! Yes, I think this makes sense, I will try it out.

Is the new mergetool already fully functional? I am having issues with merging a reposory that is also on the HPC. The repo is large, and once I do git pull (with the merging tool installed) the tmp-dir of the HPC fills up quickly. Our HPC-team says I have to set a VAR ENV, he thought mainly related to $SINGULARITY_CACHEDIR, but that didn’t help. Is there VAR ENV we need to set?

It is functional (though we might want to add better merge strategies in the future so users need to make less decisions).

Quick primer in mergetools. The way git mergetools work is that for each conflicted file, the mergetool get the source, remote and common base file and has to merge those three, independently of any other conflicts.

Since Renku metadata is split across multiple files, but those files have dependencies, we really need more context than just the file in question to make merge decisions. To this end, we check out the other branch as a git worktree into the temp directory so we can use that to access context and when the merge is done, we remove the worktree again. Of course, this has to be done for each conflict, resulting in many worktrees being created and then removed, as git does not say how many conflicts there are or when the merge is finished (So we can create a worktree once and remove it at the end).

I was under the impression that removing a worktree would remove the entry from git and the data disk (the git docs don’t say), but that assumption might be wrong and it might leave the temp directories after they’re not needed anymore. That’d certainly explain the behavior you’re seeing if there’s many conflicts.

If you can modify the source of renku in the deployment, you could apply this patch to the source and see if the problem persists:

diff --git a/renku/infrastructure/git_merger.py b/renku/infrastructure/git_merger.py
index 8e068c9e..12745238 100644
--- a/renku/infrastructure/git_merger.py
+++ b/renku/infrastructure/git_merger.py
@@ -18,6 +18,7 @@
 """Merge strategies."""

 import os
+import shutil
 from json import JSONDecodeError
 from pathlib import Path
 from tempfile import mkdtemp
@@ -86,6 +87,7 @@ class GitMerger:
             # NOTE: cleanup worktrees
             for entry in self.remote_entries:
                 client.repository.remove_worktree(entry.path)
+                shutil.rmtree(entry.path)

         if not merged:
             raise errors.MetadataMergeError("Couldn't merge metadata: remote object not found in merge branches.")

That would force remove the directory after a worktree is deleted. If that doesn’t help, we’d have to investigate further, otherwise I could make a fix including this.

Okay, thank you, that provides some context. But if the worktree itself is large, the tmp-dir could still fill up, right? The problem occurs during the pull, without finishing, so probably when the worktree is created.

So that is why we tried to change the tmp-dir, to a place where there is enough space. Do you know how we could change that?

The worktree itself is only with renku metadata (.renku/metadata/) which shouldn’t be a lot of space.

Renku itself does not allow changing the temp dir (we use tempfile.mkdtemp) but I think that does respond to the environment variables listed in gettempdir.

I tried the patch now, but it was still using a lot of the tmp-space. It is an extremely large repo though (the notorious Reproducible Data Science | Open Research | Renku).

how big the the .renku/metadata/ folder in this project, do you know?

I can try and reproduce it to see what the issue is.

The size of .metadata is 38.8 MB. I made it now a branch, I pushed that one, and now try to merge locally (instead of on the HPC). It does something and is merging, but taking a long time.

I received the following error now:

Error: Git command failed: Cmd('git') failed due to: exit code(128)
  cmdline: git sparse-checkout init --cone
  stderr: 'fatal: Unable to create '/media/rnijzink/Elements SE/WAVE/renku_projects/budyko/.git/worktrees/tmpelj013xs/info/sparse-checkout.lock': No such file or directory'

Traceback (most recent call last):
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/infrastructure/repository.py", line 1734, in _run_git_command
    return getattr(repository.git, command)(*args, **kwargs)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/git/cmd.py", line 639, in <lambda>
    return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/git/cmd.py", line 1184, in _call_process
    return self.execute(call, **exec_kwargs)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/git/cmd.py", line 984, in execute
    raise GitCommandError(redacted_command, status, stderr_value, stdout_value)
git.exc.GitCommandError: Cmd('git') failed due to: exit code(128)
  cmdline: git sparse-checkout init --cone
  stderr: 'fatal: Unable to create '/media/rnijzink/Elements SE/WAVE/renku_projects/budyko/.git/worktrees/tmpelj013xs/info/sparse-checkout.lock': No such file or directory'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/ui/cli/exception_handler.py", line 93, in main
    return super().main(*args, **kwargs)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/click/core.py", line 1053, in main
    rv = self.invoke(ctx)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/click/core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/click/core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/ui/cli/mergetool.py", line 53, in merge
    mergetool_command().with_communicator(communicator).build().execute(local=local, remote=remote, base=base)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/command/command_builder/command.py", line 310, in execute
    hook(self, context, result, *args, **kwargs)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/command/command_builder/command.py", line 246, in _post_hook
    raise result.error
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/command/command_builder/command.py", line 296, in execute
    output = context["click_context"].invoke(self._operation, *args, **kwargs)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/click/core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "/home/rnijzink/.local/lib/python3.8/site-packages/inject/__init__.py", line 342, in injection_wrapper
    return sync_func(*args, **kwargs)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/command/mergetool.py", line 45, in _mergetool
    merger.merge(local, remote, base)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/infrastructure/git_merger.py", line 62, in merge
    self._setup_worktrees(client)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/infrastructure/git_merger.py", line 109, in _setup_worktrees
    remote_repository.checkout(sparse=[database_path])
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/infrastructure/repository.py", line 241, in checkout
    self.run_git_command("sparse-checkout", "init", "--cone")
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/infrastructure/repository.py", line 375, in run_git_command
    return _run_git_command(self._repository, command, *args, **kwargs)
  File "/home/rnijzink/.local/pipx/venvs/renku/lib/python3.8/site-packages/renku/infrastructure/repository.py", line 1736, in _run_git_command
    raise errors.GitCommandError(
renku.core.errors.GitCommandError: Git command failed: Cmd('git') failed due to: exit code(128)
  cmdline: git sparse-checkout init --cone
  stderr: 'fatal: Unable to create '/media/rnijzink/Elements SE/WAVE/renku_projects/budyko/.git/worktrees/tmpelj013xs/info/sparse-checkout.lock': No such file or directory'

What version of git do you use? Updating to a new version might help.

Do you have a git init template specified? Something like

[init]
  templatedir = ~/.git_template

in your .gitconfig ?

You could also try setting extensions.worktreeConfig=true in your git config.

My git-version is git version 2.25.1, and my config does not have a template or so.

Trying now with setting extensions.worktreeConfig=true

I changed the temp-dir on the HPC now, and the pull somehow worked, but I have several conflicts:

CONFLICT (content): Merge conflict in .renku/metadata/0b/cd/0bcd3976cee945a58954c0a5f217e72cbe8228c3209a44da8d27933e288300e7

It should auto-resolve that. What does you .gitattributes and .git/config (without sensitive bits) look like?

My config looks like:

[core]
	repositoryformatversion = 0
	filemode = false
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@renkulab.io:remko.nijzink/budyko.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[submodule "src"]
	active = true
	url = https://github.com/schymans/VOM.git
[submodule "src_flexsimple"]
	active = true
	url = https://github.com/rcnijzink/flexsimple.git
[filter "lfs"]
	process = git-lfs filter-process
	required = true
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
[branch "migration_test"]
	remote = origin
	merge = refs/heads/migration_test
[branch "master_copy"]
	remote = origin
	merge = refs/heads/master_copy
[branch "master_new"]
	remote = origin
	merge = refs/heads/master_new
[branch "master_old"]
	remote = origin
	merge = refs/heads/master_old
[branch "master"]
	remote = origin
	merge = refs/heads/master
[remote "list_copy"]
	url = git@git.list.lu:wave/budyko.git
	fetch = +refs/heads/*:refs/remotes/list_copy/*
[merge "zstdmerge"]
	name = ZSTD merge
	driver = bash ../src_sh/merge.sh %O %A %B
	trustExitCode = true
[merge "renkumerge"]
	name = Renku merge driver
	driver = renku mergetool merge %O %A %B
	trustExitCode = true
	recursive = binary
[extensions]
	worktreeConfig = true

I still have the old temporary solution there, does that matter?

I was mainly looking for this, which is needed for the mergetool but can’t be committed to git, so it has to be set up locally in each checked out repo.

and .gitattributes which needs an entry .renku/metadata/** merge=renkumerge but that can be checked in. Did it say Auto-merging .renku/metadata/0b/cd/0bcd3976cee945a58954c0a5f217e72cbe8228c3209a44da8d27933e288300e7 before the message about the conflict?

git pull
warning: Cannot merge binary files: .renku/metadata/0b/cd/0bcd3976cee945a58954c0a5f217e72cbe8228c3209a44da8d27933e288300e7 (HEAD vs. db608a40eb61fd99b8c10bdc2909fc83a9cef83e)
Auto-merging .renku/metadata/0b/cd/0bcd3976cee945a58954c0a5f217e72cbe8228c3209a44da8d27933e288300e7
CONFLICT (content): Merge conflict in .renku/metadata/0b/cd/0bcd3976cee945a58954c0a5f217e72cbe8228c3209a44da8d27933e288300e7
Auto-merging .renku/metadata/0f/c2/0fc2abcdb1294b68a62a02772abe15602350c66939c1401e9bb0c92aedf11c59
Auto-merging .renku/metadata/15/af/15af29a4720449e6b27de6dd579e2c40cba4a4ec64124d8593bca2fd37ce4620
Auto-merging .renku/metadata/22/52/22525eacfd9e4eb0b8e0918f8a6203fdf88cc9391be04fc5a815b2e6b9a43514
Auto-merging .renku/metadata/37/ec/37ec949f4bd94f96b1e7f091992392e3b22bedee7f67488d9f1731c6bd127ff3
Auto-merging .renku/metadata/3d/8a/3d8a9a20d5f44c5796e06c3449b536e62512c0f1c7ff45b9a40f39239c742f36
CONFLICT (content): Merge conflict in .renku/metadata/3d/8a/3d8a9a20d5f44c5796e06c3449b536e62512c0f1c7ff45b9a40f39239c742f36
Auto-merging .renku/metadata/3d/c1/3dc110667510484db41b2f949a9f02e2c08b416d13184085a450d4752f52d753
CONFLICT (content): Merge conflict in .renku/metadata/3d/c1/3dc110667510484db41b2f949a9f02e2c08b416d13184085a450d4752f52d753
Auto-merging .renku/metadata/42/11/4211f3d7cc9d41b48ee1ffcb3db01d9da0f89f658cbd435897be785f6e06beb3
Auto-merging .renku/metadata/66/06/6606b9c4f5ff44fdbdb1716160409d8e3aa120853eda4fb3a561e4a3303f51a3
Auto-merging .renku/metadata/71/65/71659686d21b44d4915a321eb41b92b0fbdfe349f20045a3ae19e37cb1be8f4b
Auto-merging .renku/metadata/97/bf/97bfdedbbca84c44a9a25a513c9590c6516aef72c0134502bb404f95f4f59657
Auto-merging .renku/metadata/af/01/af01ab06536147bb850efa4374a0838e556d6ee9347b4826942ee2b7864ea0ad
CONFLICT (content): Merge conflict in .renku/metadata/af/01/af01ab06536147bb850efa4374a0838e556d6ee9347b4826942ee2b7864ea0ad
Auto-merging .renku/metadata/b5/83/b5837197730f4e51bd2da7835b214e85151bdee77c7b4e47afe1aa3aaad886de
Auto-merging .renku/metadata/d2/52/d25283c3f49b4a84acd25d834ffd7971d31976aa1add4087a7a6348f8e3bcd20
Auto-merging .renku/metadata/d6/82/d682c7c562a04f8a80f98b940ebe532b7f7960f9a4154addb4f4d58928339b3d
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/delz_hourly.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/delz_hourly.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/results_daily.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/results_daily.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/results_hourly.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/results_hourly.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/results_yearly.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/results_yearly.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/rsurf_daily.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/rsurf_daily.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/ruptkt_hourly.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/ruptkt_hourly.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/sce_bestpars.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/sce_bestpars.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/sce_lastbest.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/sce_lastbest.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/sce_lastloop.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/sce_lastloop.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/sce_out.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/sce_out.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/sce_progress.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/sce_progress.txt left in tree.
CONFLICT (modify/delete): data/VOM/HowardSprings/sce_prec04/su_hourly.txt deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of data/VOM/HowardSprings/sce_prec04/su_hourly.txt left in tree.
CONFLICT (modify/delete): work/VOM/HowardSprings/input_prec04/dailyweather.prn deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of work/VOM/HowardSprings/input_prec04/dailyweather.prn left in tree.
CONFLICT (modify/delete): work/VOM/HowardSprings/input_prec04/soilprofile.par deleted in db608a40eb61fd99b8c10bdc2909fc83a9cef83e and modified in HEAD.  Version HEAD of work/VOM/HowardSprings/input_prec04/soilprofile.par left in tree.
Automatic merge failed; fix conflicts and then commit the result.

So that was the main message. it tried the auto-merging, but failed.