Я промочил ноги с помощью Git и имею следующую проблему:
Дерево исходного кода моего проекта:
/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...
У меня есть код (в настоящее время MEF) в моей ветке поставщика, который я скомпилирую там, а затем переместу ссылки, в /src/refs
которые проект их берет.
Моя проблема в том, что у меня есть .gitignore
возможность игнорировать *.dll
и *.pdb
. Я могу сделать, git add -f bar.dll
чтобы форсировать добавление игнорируемого файла, это нормально, проблема в том, что я не могу понять, какие существуют файлы, которые игнорируются.
Я хочу перечислить пропущенные файлы, чтобы не забыть добавить их.
Я прочитал справочную страницу git ls-files
и не могу заставить ее работать. Мне кажется, что git ls-files --exclude-standard -i
следует делать то, что я хочу. Что мне не хватает?
git clean
трюк), как показано здесь . Кроме того, я рекомендую против примера «исключить из» в вашем резюме, так как он фактически не обращает внимания на любые файлы .gitignore. Я спрашиваю об этом особенно потому, что эта страница является лучшим ответом Google.git config --global alias.ls ls-files --exclude-standard
, и это делает ответ на этот вопросgit ls -i
.Ответы:
Ноты:
git status --ignored
.gitignore
git clean -ndX
работает на старых мерзавцев, показывая предварительный просмотр того , что игнорируемые файлы могут быть удалены (не снимая ничего)Также интересно (упоминается в qwertymk «s ответ ), вы можете также использовать
git check-ignore -v
команду, по крайней мере на Unix ( не работает в CMD Windows , сессии)Второй отображает фактическое правило,
.gitignore
позволяющее игнорировать файл в вашем git-репо.В Unix, используя « Что распространяется на все файлы в текущем каталоге рекурсивно? » И bash4 +:
(или
find -exec
команда)Примечание: https://stackoverflow.com/users/351947/Rafi Б. предлагает в комментариях , чтобы избежать (рискованный) globstar :
Не забудьте исключить файлы из
.git/
подпапки.Оригинальный ответ 42009)
должен работать, за исключением того, что его исходный код указывает:
exc_given
?Оказывается, после
-i
фактического списка нужен еще один параметр :Пытаться:
(но это будет только список вашего кэшированного (не игнорируемого) объекта с фильтром, так что это не совсем то, что вы хотите)
Пример:
На самом деле, в моем файле 'gitignore' (называемом 'exclude') я нахожу командную строку, которая может вам помочь:
Так....
должен сделать свое дело.
Как упомянуто на справочной странице ls-files ,
--others
это важная часть, чтобы показать вам не кешированные, не зафиксированные, обычно игнорируемые файлы.--exclude_standard
это не просто ярлык, а способ включить все стандартные настройки «игнорируемых шаблонов».источник
git status --ignored
кажется, он также показывает неотслеживаемые файлы: github.com/git/git/blob/master/Documentation/RelNotes/…git check-ignore -v *
прекрасно работает, так как показывает, где применяется конфиг. Спасибо.shopt -s globstar
после чего он должен работать.git check-ignore -v $(find . -type f -print)
Есть гораздо более простой способ сделать это (git 1.7.6+):
См. Есть ли способ сообщить git-status, чтобы он игнорировал эффекты файлов .gitignore?
источник
error: unknown option 'ignored'
. Даже добавление,-s
как предлагается в связанном посте, не работает.-s
. Вы можете попытатьсяgit status -h
узнать,--ignored
поддерживается ли этоgit clean -ndX
решение, потому что редкая ситуация, когда кто-то по ошибке забывает флаги, будет иметь безвозвратный эффект на хранилище, так как неотслеживаемые файлы удаляются. Так что это опасно. Напротив,git status --ignored
это всегда безопасно, даже когда ошибочно напечатано, и это естественно запомнить.Другой вариант, который довольно чистый (без каламбура):
Объяснение:
Примечание. В этом решении не отображаются проигнорированные файлы, которые уже были удалены.
источник
make clean
и очень полезно на сервере сборки.git ls-files -o -i --exclude-standard
.git clean -dXn
всегда был тем, что я хотел, но не показывает проигнорированные файлы, которые уже были удалены.git ls-files -o -i --exclude-standard
может сделать это. Так что это может быть причиной разницы.n
первый, меньший шанс случайного удаления таким образом;git clean -ndX
n
Git по умолчаниюfatal: clean.requireForce defaults to true and neither -n nor -f given; refusing to clean
. Все еще довольно безопасно, но печататьn
первое еще безопаснее! :)Хотя в целом правильное ваше решение не работает при любых обстоятельствах. Предположим, что каталог репо выглядит так:
и .gitignore, как это:
Это игнорирует
doc
каталог и все файлы нижеtmp
. Git работает как положено, но данная команда для вывода списка игнорируемых файлов - нет. Давайте посмотрим, что говорит Git:Обратите внимание, что
doc
отсутствует в списке. Вы можете получить это с:Обратите внимание на дополнительную
--directory
опцию.Насколько мне известно, нет ни одной команды, чтобы вывести список всех игнорируемых файлов одновременно. Но я не знаю, почему
tmp/dir0
не появляется вообще.источник
(git ls-files -oi --exclude-standard; git ls-files -oi --exclude-standard --directory) | perl -nle '$seen{$_}++||next;if(-d){system"find",$_,"-type","f"}else{print}'
Git теперь имеет встроенную функциональность
Конечно, вы можете изменить глобус на что-то, как
**/*.dll
в вашем случаеGit Reference
источник
git check-ignore **/*
включить файлы в подкаталогиДолжно быть достаточно использовать
поскольку это охватывает все, что покрыто
следовательно, последнее является излишним.
Вы можете сделать это проще, добавив псевдоним в свой
~/.gitconfig
файл:Теперь вы можете просто напечатать,
git ignored
чтобы увидеть список. Намного легче запомнить и быстрее набирать текст.Если вы предпочитаете более сжатое отображение решения Джейсона Гена, вы можете добавить псевдоним для этого, например:
Однако более подробный вывод более полезен для устранения проблем с файлами .gitignore, так как в нем перечислены все файлы, которые игнорируются. Обычно вы передаете результаты по конвейеру,
grep
чтобы увидеть, находится ли там файл, который вы ожидаете игнорировать, или же там находится файл, который вы не хотите игнорировать.Затем, когда вы просто хотите увидеть короткий дисплей, его достаточно легко запомнить и напечатать
(
-s
Обычно это можно отключить.)источник
git status --ignored
работает над Debian sid, но может быть очень новым… но, видимо, он был добавлен из-заВот как напечатать полный список файлов в рабочем дереве, которые соответствуют шаблонам, расположенным в любом месте в нескольких источниках Gitignore Git (если вы используете GNU
find
):Он проверит все файлы в текущей ветви репозитория (если вы не удалили их локально).
И это также идентифицирует конкретные исходные строки gitignore.
Git продолжает отслеживать изменения в некоторых файлах, которые соответствуют шаблонам gitignore, просто потому, что эти файлы уже были добавлены. Полезно, что приведенная выше команда также отображает эти файлы.
Отрицательные образцы gitignore также подобраны. Тем не менее, они легко различимы в списке, потому что они начинаются с
!
.Если вы используете Windows, Git Bash включает GNU
find
(как показаноfind --version
).Если список длинный (и у вас есть
rev
), вы можете отобразить их также по расширению (несколько):Для более подробной информации, см
man find
,man git-check-ignore
,man rev
, иman sort
.Смысл всего этого подхода в том, что Git (программное обеспечение) быстро меняется и является очень сложным. В отличие от проекта GNU
find
является чрезвычайно стабильной (по крайней мере, в его функции используется здесь). Таким образом, любой, кто хочет быть конкурентоспособным, демонстрируя свои глубокие знания Git, ответит на вопрос по-другому.Какой лучший ответ? Этот ответ намеренно сводит к минимуму зависимость от знаний Git для достижения цели стабильности и простоты с помощью модульности (информационной изоляции) и рассчитан на длительное использование.
источник
(расширяя другие ответы)
Обратите внимание,
git check-ignore
использует совершенное,.gitignore
а не одно в вашем рабочем дереве! Чтобы поиграть с ним, не загрязняя свою историю git, вы можете свободно попробовать отредактировать его, а затем зафиксировать с помощьюgit commit --amend
.Эта проблема возникает, в основном, если вам нужен обходной путь, когда git не следует каталогам. Введите в
.gitignore
:.keep
должен быть файл нулевой длины вdirtokeep
.Результатом будет то, что все в
dirtokeep
будет игнорироваться, кромеdirtokeep/.keep
, что приведет к тому, чтоdirtokeep
каталог будет построен на clone / checkout.источник
Если есть несколько игнорируемых каталогов, почему бы не использовать «git status node / logs /», который скажет вам, какие файлы нужно добавить? В каталоге у меня есть текстовый файл, который не является частью вывода статуса, например:
На главном филиале
Ваша ветвь обновлена с «origin / master».
Не отслеживаемые файлы:
(используйте «git add ...» для включения в то, что будет зафиксировано)
.gitignore это:
*
! .gitignore
источник