Исключить папку в .gitignore с длинным путем, используя git (GitHub для Windows)

Скажем, у меня есть папка

/project1/superlong/path/to/the/folder/I/want/to/exclude/in/my/gitignore/file/

и у меня есть одна и та же папка в нескольких проектах, но у каждого проекта есть другая первая папка в этом сверхдлинном пути.

Позвольте мне показать вам, о чем я говорю: /project1/superlong/path/to/the/folder/I/want/to/exclude/in/my/gitignore/file/ /project2/superlong/path/to/the/folder/I/want/to/exclude/in/my/gitignore/file/ /project3/superlong/path/to/the/folder/I/want/to/exclude/in/my/gitignore/file/

и т.д

Итак, в моем .gitignore мне в основном нужна простая простая строка, подобная этой, только с двумя последними папками, которые, как я знаю, всегда будут уникальными во всей структуре папок:

gitignore/file/

Я пробовал это в своем файле .gitignore, но это не сработало. Я пропустил звездочку или что-то? Я ознакомился со страницами руководства, но это руководство не является интуитивно понятным с очень плохими примерами.

Обновление: очевидно, что текущая версия GitHub для Windows использует более старую версию git, в которой отсутствует поддержка **. Смотрите комментарии ниже для получения дополнительной информации.


person PussInBoots    schedule 21.05.2013    source источник
comment
**/gitignore/file/ должно работать   -  person 1615903    schedule 21.05.2013
comment
@ user1615903: **/gitignore/file/ у меня не сработало.   -  person PussInBoots    schedule 21.05.2013
comment
Файлы уже добавлены в git? Gitignore не работает с уже добавленными файлами.   -  person 1615903    schedule 21.05.2013
comment
@ user1615903: они не добавляются. Потому что, когда я ввожу полный путь в .gitignore и переключаюсь обратно на Github для Windows, он исключает файлы.   -  person PussInBoots    schedule 21.05.2013
comment
В этих папках есть файлы?   -  person levelnis    schedule 21.05.2013
comment
@levelnis: Да, у меня в этой папке 14 файлов. Три из них являются файлами .log, а остальные имеют автоматически сгенерированное расширение файла (дата), например: somefile.log.20120410.   -  person PussInBoots    schedule 21.05.2013
comment
Я удалил все из файла .gitignore, кроме **/gitignore/file/, чтобы другие записи никак не мешали. Все еще не работает.   -  person PussInBoots    schedule 21.05.2013
comment
Я еще не прочитал все ответы на этот вопрос, касающиеся **, но я просто хотел бы указать, что синтаксис двойной звездочки работает только в Git версии 1.8.2+, поэтому, если вы используете более раннюю версию Git, этот синтаксис не будет работать. См. примечания к выпуску 1.8.2.   -  person    schedule 21.05.2013


Ответы (3)


Глядя на другие сообщения, кажется, что ** - конкретный узор. Если у вас всегда одинаковая глубина папок, вы можете использовать это:

*/*/*/*/*/*/*/*/*/*/*/*/gitignore/file/

Я проверил это в плагине управления исходным кодом git для VS, и, похоже, он работает. Хотя это некрасиво! (Я основываю это на вашем примере 12 уровней пути выше /gitignore)

В В этой статье говорится, что .gitignore не Поддерживаю ** напрямую. Он рекомендует помещать файл .gitignore (в вашем случае) в каждую из папок gitignore, соответствующих file/. Тоже не идеально, но, возможно, немного лучше, чем рисунок выше.

Обновлять:

Пока вы сопоставляете только одну папку, это должно работать независимо от того, где она находится в структуре папок:

gitignore/
person levelnis    schedule 21.05.2013
comment
Кажется, это работает, но, как вы сами упомянули, это некрасиво, и это не то, что я хочу. Должно быть более элегантное решение без x числа /*? - person PussInBoots; 21.05.2013
comment
Кроме того, в этом конкретном случае количество уровней папок может варьироваться от проекта к проекту. Количество уровней папок также устанавливается разными разработчиками, которые сами решают, сколько уровней подходит для данного конкретного проекта. - person PussInBoots; 21.05.2013
comment
Что, если папка gitignore существует в какой-то другой части моей структуры папок (за пределами сверхдлинного пути из моего вопроса), которую я не хочу исключать? Если это так, то gitignore/ также исключит эту структуру папок и, следовательно, не будет служить правильным ответом. - person PussInBoots; 21.05.2013
comment
В этом случае мне пришлось бы задаться вопросом, почему у вас есть папка с именем gitignore по пути, который нельзя игнорировать? Не так уж сложно принять командное решение назвать папку внутри глубокой структуры, которую нужно игнорировать gitignore и больше нигде не использовать. - person levelnis; 21.05.2013
comment
Допустим, у вас есть два разных пути: 1. /a/b/c/d/e/foo/bar 2. /1/2/foo/bar/3/4/5, и я хочу исключить только первый путь. Разве bar/ в .gitignore не будет исключать оба пути? - person PussInBoots; 21.05.2013
comment
Или что, если у меня есть: 1. /a/b/c/gitignore 2. /1/2/3/gitignore и я хочу исключить только первый путь? gitignore/ исключит оба пути». - person PussInBoots; 21.05.2013
comment
@ColdHawaiian Какая версия git поставляется с Github для Windows? В этом случае это объясняет, почему у меня не работает **, если Github для Windows поставляется с более старой версией git. - person PussInBoots; 21.05.2013
comment
Я проверил git.exe в C:\Users\<User>\AppData\Local\GitHub\PortableGit_93e8418133eb85e81a81e5e19c272776524496c6\bin, и он говорит: File version: 1.8.0.0 и Product version: 1.8.0.msysgit.0, значит, текущий Github for Windows Version 1.0.36.0 не поддерживает **? - person PussInBoots; 21.05.2013
comment
@PussInBoots, похоже, это так. Вы также можете проверить свою версию Git с помощью git --version в командной строке, предполагая, что ваша оболочка/терминал/консоль использует тот же исполняемый файл Git, что и GitHub для Windows. - person ; 21.05.2013
comment
Пришлось подтвердить с GitHub, поэтому я отправил им электронное письмо; вот что они сказали (соответствующие части): Мы отправляем последнюю официальную версию Git для Windows (вы можете увидеть их все по адресу code.google.com/p/msysgit/downloads/) с GitHub для Windows. Текущая версия GitHub для Windows (1.0.47) поставляется с Git 1.8.1.2. Когда будет доступен официальный выпуск 1.8.2, мы обновим его вместе с GitHub для Windows. К сожалению, я не знаю, сколько времени пройдет, прежде чем появится официальный 1.8.2 Git для Windows. Извините, у меня нет лучшего ответа. - person PussInBoots; 22.05.2013

Ты можешь использовать :

**/gitignore/file

А затем зафиксируйте файл .gitignore.

Однако этот пост может вам помочь

person cexbrayat    schedule 21.05.2013
comment
**/ исключает файлы. Но разве это не исключает всего? Это не то, чего я хочу. - person PussInBoots; 21.05.2013
comment
**/gitignore/file исключит любые файлы в каталоге, соответствующем выражению. Таким образом, он должен исключить /project1/superlong/path/to/the/folder/I/want/to/exclude/in/my/gitignore/file/ и /a/b/gitignore/file. - person cexbrayat; 21.05.2013
comment
Нет, не работает. Пробовал с косой чертой и без косой черты. - person PussInBoots; 21.05.2013
comment
Нужно ли мне зафиксировать файл .gitignore, синхронизировать изменения с github, а затем протестировать исключенную папку для GitHub для Windows, чтобы распознать изменения? Это Github для Windows? GfW обнаруживает другие изменения, которые я вношу в файл .gitignore, в режиме реального времени, поэтому кажется странным, что ему не нравится этот конкретный шаблон? - person PussInBoots; 21.05.2013
comment
Да, вы должны зафиксировать файл .gitignore с вашими изменениями, чтобы сделать их эффективными, но нет необходимости в синхронизации с Github. - person cexbrayat; 21.05.2013
comment
Нет, вам не нужно коммитить .gitignore, чтобы он работал. - person poke; 21.05.2013
comment
Теперь у меня есть это в моем файле .gitignore: **/gitignore/file, и я зафиксировал только файл .gitignore, но Github для Windows по-прежнему показывает мне файлы .log и сообщает, что их нужно зафиксировать. - person PussInBoots; 21.05.2013
comment
@poke: я думаю, вы правы, потому что всякий раз, когда я вношу другие изменения в .gitignore, они сразу же отражают изменения в Github для Windows. Похоже, Github для Windows просто **/gitignore/file не нравится. - person PussInBoots; 21.05.2013
comment
Если вы хотите игнорировать файлы .log, используйте */gitignore/file/.log - person cexbrayat; 21.05.2013
comment
Для этого конкретного вопроса я хочу исключить все, что находится в вышеупомянутом пути к папке. Папка содержит и другие файлы с другими расширениями. Не только файлы .log. - person PussInBoots; 21.05.2013

В конце концов, все дело в людях. И поскольку я всегда стремлюсь к наиболее интуитивным решениям, я считаю этот ответ победителем.

/project1/superlong/path/to/the/folder/I/want/to/exclude/in/my/gitignore/file /project2/superlong/path/to/the/folder/I/want/to/exclude/in/my/gitignore/file /project3/superlong/path/to/the/folder/I/want/to/exclude/in/my/gitignore/file

И если кто-то предложит лучшее, более элегантное решение, которое работает с Github для Windows, я был бы более чем счастлив изменить принятый ответ.

person PussInBoots    schedule 21.05.2013