Можно ли попросить git diff включить неотслеживаемые файлы в свой вывод diff? Или мой лучший выбор - добавить новые файлы, которые я создал, и существующие файлы, которые я отредактировал, и использовать
git diff --cached
?
Можно ли попросить git diff включить неотслеживаемые файлы в свой вывод diff? Или мой лучший выбор - добавить новые файлы, которые я создал, и существующие файлы, которые я отредактировал, и использовать
git diff --cached
?
Ответы:
В последних версиях git вы можете git add -N
использовать файл (или --intent-to-add
), который добавляет блоб нулевой длины к индексу в этом месте. В результате ваш «неотслеживаемый» файл теперь становится модификацией для добавления всего содержимого в этот файл нулевой длины, и это отображается в выводе «git diff».
git diff
echo "this is a new file" > new.txt
git diff
git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file
К сожалению, как указано, вы не можете, git stash
пока у вас есть --intent-to-add
файл, ожидающий, как это. Хотя, если вам нужно спрятать, просто добавьте новые файлы, а затем спрячьте их. Или вы можете использовать обходной путь эмуляции:
git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
(настройка псевдонима - ваш друг здесь).
git add -N .
Я считаю, что вы можете различать файлы в вашем индексе и неотслеживаемые, просто указав путь к обоим файлам.
git diff --no-index tracked_file untracked_file
git diff --no-index untracked_file_1 untracked_file_2
для git diff
раскраски синтаксиса и т. Д. На diffs ... красиво.
/dev/null
вместо: git diff --no-index -- /dev/null <untracked_file>
.
cat untracked_file_1
, или, возможно, printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"
если вам действительно нужен зеленый выход. :) (Хотя на более серьезной ноте, обратите внимание, что подстановка команд удалит завершающие символы новой строки из вашего файла.)
Для моей интерактивной повседневной работы (где я постоянно разрабатываю рабочее дерево по отношению к HEAD и хотел бы, чтобы неотслеживаемые файлы были включены в diff), add -N/--intent-to-add
он непригоден, потому что он ломается git stash
.
Так вот моя git diff
замена. Это не особо чистое решение, но, поскольку я действительно использую его только в интерактивном режиме, у меня все в порядке с хаком:
d() {
if test "$#" = 0; then
(
git diff --color
git ls-files --others --exclude-standard |
while read -r i; do git diff --color -- /dev/null "$i"; done
) | `git config --get core.pager`
else
git diff "$@"
fi
}
d
Печатая просто включит неотслеживаемые файлы в diff (что меня беспокоит в моем рабочем процессе), и d args...
будет вести себя как обычный git diff
.
Ноты:
git diff
на самом деле объединяются отдельные разностные различия, поэтому невозможно определить d
выходные данные из «реального различий» - за исключением того факта, что все неотслеживаемые файлы сортируются последними.git diff
. Если кто-то выяснит, как это сделать, или если какая-то функция будет добавлена git
в какой-то момент в будущем, пожалуйста, оставьте примечание здесь!git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
обходной путь, который я предложил для более старых gits , работает git stash
, предполагая, что у вас уже есть e69de29bb в вашей базе данных, например, при попытке использовать add -N
ранее. Так что, по-видимому, это не совсем то же самое, что и git add -N
: я не знаю, как.
test
Кстати, вы выполняете сравнение строк, а не проверку числового равенства с помощью вашей команды. Ничего не должно влиять, но test "$#" -eq 0
точнее то, что задумано.
less
чтобы вам не нужно было нажимать q
для каждого файла, и это выглядит точно так же git diff
, удаляя разбиение на страницы для каждого файла ( -P
), добавляя его впоследствии ( | less
), сохраняя цвет ( --color=always
) и интерпретируя его как цвет ( less -r
или less -R
). Так в целом это:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(например, if [ -t 1 ]; then color_arg=--color; fi
что-то вроде этого), это способ для оболочки проверить, является ли ее вывод терминалом, что является полезным способом выбора цвета. И xargs
может дать способ избавиться от цикла while. Вам все еще понадобится -n 1
это, так что он все равно будет запускать git несколько раз, и все равно должен быть попарно таким образом, но ... он избавляется от, while
и read
, может быть, так лучше ?! Я оставляю это читателю.
Не на 100%, но если по какой-то причине вы не хотите добавлять свои файлы в индекс, как предполагает принятый ответ, вот еще один вариант:
Если файлы не отслеживаются, очевидно, что diff - это весь файл, так что вы можете просто просмотреть их с меньшим количеством:
less $(git ls-files --others --exclude-standard)
Перейдите между ними с помощью :n
и :p
для следующего и предыдущего ..
Обновление из комментариев: Если вам нужен формат патча, вы также можете комбинировать его с git diff
:
git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less
В этом случае вы также можете перенаправить вывод в файл или использовать другую команду diff.
git diff /dev/null <untracked_tile>
и получить патч в формате патча, а не «просто» файл
git add -A
git diff HEAD
При необходимости сгенерируйте патч, а затем:
git reset HEAD
git add -p
очень часто (что я обычно рекомендую, между прочим) ... Это дает способ сделать основную вещь, просто ... следует отметить, что у нее есть потенциал для нежелательной стороны последствия.
это работает для меня:
git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt
Последний шаг не является обязательным, он оставит файл в предыдущем состоянии (без отслеживания)
полезно, если вы тоже создаете патч:
git diff --cached my_file.txt > my_file-patch.patch
Изменения работают, когда поставлены и не поставлены с этой командой. Новые файлы работают при постановке:
$ git diff HEAD
Если они не организованы, вы увидите только различия файлов.
git add
от каждого не отслеживаемого файла
git add
его, то проще всего будет проверить, что вы только что добавили / хотите добавить
Для одного файла:
git diff --no-index /dev/null new_file
Для всех новых файлов:
for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;
Как псевдоним:
alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"
Для всех измененных и новых файлов, объединенных в одну команду:
{ git --no-pager diff; gdnew }
обычно, когда я работаю с командами удаленного определения местоположения, для меня важно, чтобы у меня были предварительные знания о том, какие изменения были сделаны другими командами в том же файле, прежде чем я буду следовать этапам git untrack -> staged -> commit для этого, я написал скрипт bash, который помогите мне избежать ненужного разрешения конфликта слияния с удаленной командой или создания новой локальной ветки и сравнения и слияния в основной ветке
#set -x
branchname=`git branch | grep -F '*' | awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | grep "modified" | awk "{print $2}" `
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file
git difftool FETCH_HEAD $file ;
done
В приведенном выше сценарии я выбираю удаленную основную ветвь (не обязательно ее основную ветвь), чтобы FETCH_HEAD создал список только моего измененного файла и сравнил измененные файлы с git difftool
здесь много difftool, поддерживаемых git, я настраиваю 'Meld Diff Viewer' для хорошего сравнения GUI.
Предполагая, что у вас нет локальных коммитов,
git diff origin/master
git diff
команду, которая включает неотслеживаемые файлы. Эта команда не включает их. Кроме того, наличие локальных коммитов не имеет абсолютно никакого отношения к вопросу.
git merge --squash mybranch
и git diff master
показал мне изменения в неотслеживаемых файлах.
git diff
не показывает различий в неотслеживаемых файлах: поскольку они не отслеживаются, по определению различий нет. Просто так работает Git. :)