Как определить конфликтующие фиксации хешем во время перебазы мерзавцев?

1) Установите System.Linq.Dynamic

2) Добавьте следующий код

public static class OrderUtils
{
    public static string ToStringForOrdering(this Expression> expression, bool isDesc = false)
    {
        var str = expression.Body.ToString();
        var param = expression.Parameters.First().Name;
        str = str.Replace("Convert(", "(").Replace(param + ".", "");
        return str + (isDesc ? " descending" : "");
    }
}

3) Напишите свой переключатель для выбора Lambda function

public static class SortHelper
{
    public static Expression> UserApp(string orderProperty)
    {
        orderProperty = orderProperty?.ToLowerInvariant();
        switch (orderProperty)
        {
            case "firstname":
                return x => x.PersonalInfo.FirstName;
            case "lastname":
                return x => x.PersonalInfo.LastName;
            case "fullname":
                return x => x.PersonalInfo.FirstName + x.PersonalInfo.LastName;
            case "email":
                return x => x.Email;

        }
    }
}

4) Используйте ваши помощники

Dbset.OrderBy(SortHelper.UserApp("firstname").ToStringForOrdering())

5) Вы можете использовать его с pagging ( PagedList )

public virtual  IPagedList GetPage(Page page, Expression> where, Expression> order, bool isDesc = false,
      params Expression>[] includes)
    {
        var orderedQueryable = Dbset.OrderBy(order.ToStringForOrdering(isDesc));
        var query = orderedQueryable.Where(where).GetPage(page);
        query = AppendIncludes(query, includes);

        var results = query.ToList();
        var total =  Dbset.Count(where);

        return new StaticPagedList(results, page.PageNumber, page.PageSize, total);
    }

Объяснение

System.Linq.Dynamic позволяет нам установить строковое значение в методе OrderBy. Но внутри этого расширения строка будет анализироваться на Lambda. Поэтому я подумал, что это сработает, если мы проанализируем Lambda на строку и передадим ее методу OrderBy. И это работает!

40
задан RobM 22 January 2010 в 15:40
поделиться

2 ответа

Short Answer

Если там написано

Patch failed at 0001 commit message for F

, то запустите

$ head -1 .git/rebase-apply/0001
From ad1c7739c1152502229e3f2ab759ec5323988326 Mon Sep 17 00:00:00 2001

, чтобы получить SHA ad1c77 из неудачного коммита, а затем используйте git-шоу ad1c77, чтобы посмотреть на него.

Длинный ответ

Давайте начнём с этого дерева:

A---B---C---D
     \
      E---F---G

$ git checkout G
$ git rebase D

Когда возникает конфликт rebase, это конфликт между

  • восходящими изменениями (C--D) от общего предка (B) PLUS уже возвращенными изменениями и уже разрешенным конфликтом (E') против
  • патча следующего коммита (F)

Посмотрим, что произойдет:

1) A---B---C---D---E'          <- E patched and committed successfully as E'
2) A---B---C---D---E'---       <- failed to patch F onto E'

Вот сообщение об ошибке:

First, rewinding head to replay your work on top of it...
Applying: commit message for F
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Failed to merge in the changes.
Patch failed at 0001 commit message for F

Сначала видно, что это был F, так как появляется сообщение коммита. Однако, если все ваши сообщения коммита выглядят как "foo", "документация" или "некоторые исправления", то это не поможет, и вам действительно нужен SHA id ad1c77 или содержимое патча.

Вот как узнать реальную идентичность F:

Когда он перечисляет конфликт rebase, он говорит что-то вроде:

Patch failed at 0001 commit message for F

Теперь посмотрите в .git/rease-apply/, где вы найдете файл патча 0001:

$ ls .git/rebase-apply
0001          head-name     msg           orig-head     sign
0002          info          msg-clean     patch         threeway
apply-opt     keep          next          quiet         utf8
final-commit  last          onto          rebasing

Файл патча включает в себя оригинальный коммит-ид

$ head -1 .git/rebase-apply/0001
From ad1c7739c1152502229e3f2ab759ec5323988326 Mon Sep 17 00:00:00 2001

Вы можете посмотреть на это.

Должен быть более простой способ, но он работает.

Обратите внимание, что тот факт, что патч вышел из строя, может быть связан с другим коммитом (если вы делаете ребейсинг на общего предка HEAD и цель ребейсинга). Найти этот коммит довольно сложно, хотя вы можете попробовать сделать переброс в обратном направлении, чтобы найти его:

$ git checkout D
$ git rebase G
39
ответ дан 27 November 2019 в 01:47
поделиться

Начиная с Мерзавца 2.17 (март 2018), Вы не должны должны быть использовать rebase-apply.

новое" --show-current-patch" опция уступает дорогу конечному пользователю, сталкивающемуся для получения diff применяемый, когда" git rebase" (и" git am") останавливается с конфликтом.

См. fbd7a23 фиксации, фиксация 6633529 , фиксация 984913a (11 февраля 2018) [1 114] Nguyб» … n ThГЎi Ngб» Ќc Duy (pclouds) .
<глоток> (Объединенный [1 115] Junio C Hamano - gitster -
в [1 116] фиксация 9ca488c , 06 марта 2018)

am : добавьте - выставочный текущий патч

<глоток> Signed-off-by: Nguyб» … n ThГЎi Ngб» Ќc Duy

Указание на пользователя к [1 110] может поощрить их бездельничать там, который не является хорошей вещью.

С этим, пользователь не должен иметь в наличии путь где-нибудь (потому что после нескольких команд, путь может быть вне буфера scrollback), когда они должны посмотреть на патч.

Посмотрите больше в" Шоу текущий мерзавец интерактивная переосновная операция "

Пример:

C:\Users\VonC\repo\src>git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: change code
Using index info to reconstruct a base tree...
M       a/src/file
Falling back to patching base and 3-way merge...
Auto-merging a/src/file
CONFLICT (content): Merge conflict in a/src/file
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch' to see the failed patch                  <======
Patch failed at 0001 change code
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

Вы тогда добрались бы:

C:\Users\VonC\rep\src>git am --show-current-patch
  commit xxx (master)
  Author: VonC <vonc@vonc.com>
  Date:   Mon Nov 4 13:59:18 2019 +0100

      change code

  diff --git a/a/src/file b/a/src/file
  index yyy..zzz 100644
  --- a/a/src/file
  +++ b/a/src/file
  @@ -13,5 +13,5 @@ file: /a/src
   content line 1
   content line 2
   content line 3
   content line 4
  -content line 5
  -content line 6
  +content bis line 5
  +content bis line 6
0
ответ дан 27 November 2019 в 01:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: