# in this loop.
merge_name=$(for remote
do
- rh=$(git-rev-parse --verify "$remote"^0 2>/dev/null) &&
- bh=$(git show-ref -s --verify "refs/heads/$remote") &&
+ rh=$(git-rev-parse --verify "$remote"^0 2>/dev/null) ||
+ continue ;# not something we can merge
+ bh=$(git show-ref -s --verify "refs/heads/$remote" 2>/dev/null)
if test "$rh" = "$bh"
then
echo "$rh branch '$remote' of ."
echo "Updating $(git-rev-parse --short $head)..$(git-rev-parse --short $1)"
git-update-index --refresh 2>/dev/null
new_head=$(git-rev-parse --verify "$1^0") &&
- git-read-tree -u -v -m $head "$new_head" &&
+ git-read-tree -v -m -u --exclude-per-directory=.gitignore $head "$new_head" &&
finish "$new_head" "Fast forward"
dropsave
exit 0
case "$best_strategy" in
'')
restorestate
- echo >&2 "No merge strategy handled the merge."
+ case "$use_strategies" in
+ ?*' '?*)
+ echo >&2 "No merge strategy handled the merge."
+ ;;
+ *)
+ echo >&2 "Merge with strategy $use_strategies failed."
+ ;;
+ esac
exit 2
;;
"$wt_strategy")
#include <signal.h>
#include <sys/time.h>
#include "cache.h"
+ #include "dir.h"
#include "tree.h"
#include "tree-walk.h"
#include "cache-tree.h"
{
int baselen = strlen(base);
int src_size = len + 1;
+ int i_stk = i_stk;
+ int retval = 0;
+
+ if (o->dir)
+ i_stk = push_exclude_per_directory(o->dir, base, strlen(base));
+
do {
int i;
const char *first;
}
/* No name means we're done */
if (!first)
- return 0;
+ goto leave_directory;
pathlen = strlen(first);
ce_size = cache_entry_size(baselen + pathlen);
newbase[baselen + pathlen] = '/';
newbase[baselen + pathlen + 1] = '\0';
if (unpack_trees_rec(subposns, len, newbase, o,
- indpos, df_conflict_list))
- return -1;
+ indpos, df_conflict_list)) {
+ retval = -1;
+ goto leave_directory;
+ }
free(newbase);
}
free(subposns);
free(src);
} while (1);
+
+ leave_directory:
+ if (o->dir)
+ pop_exclude_per_directory(o->dir, i_stk);
+ return retval;
}
/* Unlink the last component and attempt to remove leading
int i;
struct object_list *posn = trees;
struct tree_entry_list df_conflict_list;
- struct cache_entry df_conflict_entry;
+ static struct cache_entry *dfc;
memset(&df_conflict_list, 0, sizeof(df_conflict_list));
df_conflict_list.next = &df_conflict_list;
state.refresh_cache = 1;
o->merge_size = len;
- memset(&df_conflict_entry, 0, sizeof(df_conflict_entry));
- o->df_conflict_entry = &df_conflict_entry;
+
+ if (!dfc)
+ dfc = xcalloc(1, sizeof(struct cache_entry) + 1);
+ o->df_conflict_entry = dfc;
if (len) {
posns = xmalloc(len * sizeof(struct tree_entry_list *));
/*
* We do not want to remove or overwrite a working tree file that
- * is not tracked.
+ * is not tracked, unless it is ignored.
*/
static void verify_absent(const char *path, const char *action,
struct unpack_trees_options *o)
if (o->index_only || o->reset || !o->update)
return;
- if (!lstat(path, &st))
+ if (!lstat(path, &st) && !(o->dir && excluded(o->dir, path)))
die("Untracked working tree file '%s' "
"would be %s by merge.", path, action);
}