Git: Apply Diff of New File - PullRequest
       9

Git: Apply Diff of New File

0 голосов
/ 09 мая 2018

У меня был скрипт, который для каждого измененного_файла в

"git diff --name-only master..origin/master"

diff для этого файла применяется следующим образом:

git diff master..origin/master file_name | git apply.

Для любых вновь создаваемых файлов (файлы в оригинале master, но не в оригинале master) я получил следующие ошибки:

fatal: ambiguous argument 'my_file_name': unknown revision or path not in the working tree.

error: unrecognized input

После поиска в SO я нашел следующую информацию о флаге намерения добавить в git add: Что делает git add --intent-to-add или -N и когда его следует использовать?

Итак, я попробовал следующее: для каждого файла, который я собираюсь получить из различий между origin / master и master, если этот файл в данный момент не существует в master (local), тогда я вызываю git add с - намерение добавить флаг перед вызовом git diff с этим именем и применением diff.

if ! ls "$changed_file" 1> /dev/null 2>&1; then
        echo adding new file "$changed_file"
        echo foo > "$changed_file"
        git add --intent-to-add "$changed_file"
fi
git diff master..origin/master "$changed_file" | git apply

При этом я получаю следующую ошибку при попытке применить git apply (последняя строка), говоря, что файл уже существует в рабочем каталоге:

error: tests/new_file: already exists in working directory

Когда я попытался удалить фиктивную часть создания файла, как показано ниже, она также не работала.

if ! ls "$changed_file" 1> /dev/null 2>&1; then
        echo adding new file "$changed_file"
        git add --intent-to-add "$changed_file"
fi

с сообщением об ошибке, таким же, как и раньше:

fatal: ambiguous argument 'my_file_name': unknown revision or path not in the working tree.

error: unrecognized input

Кто-нибудь знает, что происходит, и как я могу это исправить? (получить и применить diff нового удаленного файла)

Ответы [ 2 ]

0 голосов
/ 09 мая 2018
git reset --hard origin/master      # reset index, worktree and ref
git reset --soft @{1}               # put the ref back

- это все, что вам нужно.

0 голосов
/ 09 мая 2018

Проблема в том, что в общем случае Git не знает, является ли file_name именем файла или именем ветви , или как. Решение состоит в том, чтобы сообщить это: после двойной черты --, ничто не может быть именем опции или ветви:

git diff --name-only master origin/master -- file_name

То же правило применяется к таким командам, как git checkout. Что если у вас есть файл с именем master, и вы хотите проверить его? Команда:

git checkout master

не будет работать, но команда:

git checkout -- master

будет , потому что две черточки сообщают git checkout, что это конец параметров и имен веток и так далее: все остальное должно быть именем файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...