Проблема здесь в том, что код, определяющий переименование файла, а также старое и новое имена, использует две строки:
rename from dir1/file2.txt
rename to dir2/file2_rename.txt
, которые, как вы можете видеть, включают dir1/
и dir2/
части, но не a/
или b/
части. Это все равно будет так, даже если вы не использовали --no-prefix
в команде git diff
.
В конце концов, git apply
опция -p1
, которая обычно удаляет только a/
и b/
теперь удаляет dir1/
и dir2/
из других строк diff, но ничего не делает с этими двумя строками. Внутри git apply
удаляет на один префиксов меньше, чем git apply
, как правило:
static int gitdiff_renamesrc(struct gitdiff_data *state,
const char *line,
struct patch *patch)
{
patch->is_rename = 1;
free(patch->old_name);
patch->old_name = find_name(state->root, line, NULL,
state->p_value ? state->p_value - 1 : 0, 0);
return 0;
}
Используя git diff
без --no-prefix
и git apply -p2
, Git будет таким образом уберите один компонент из этих двух имен. Так что может помочь использование -p2
на шаге apply
вместо --no-prefix
в команде git diff
.