Nice programing

.gitignore 제외 폴더이지만 특정 하위 폴더 포함

nicepro 2020. 9. 28. 10:01
반응형

.gitignore 제외 폴더이지만 특정 하위 폴더 포함


.gitignore에 추가하는 application / 폴더가 있습니다. application / 폴더 안에는 application / language / gr 폴더가 있습니다. 이 폴더를 어떻게 포함시킬 수 있습니까? 나는 이것을 시도했다

application/
!application/language/gr/

운없이 ...


제외 application/하면 그 아래에있는 모든 항목이 항상 제외됩니다 (나중에 일부 제외 패턴 ( "무시")이 아래의 항목과 일치하더라도 application/).

원하는 작업을 수행하려면 "무시"하려는 모든 상위 디렉터리를 "무시"해야합니다. 일반적으로이 상황에 대한 규칙을 쌍으로 작성하게됩니다. 특정 하위 디렉토리가 아닌 디렉토리의 모든 것을 무시합니다.

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

참고
후행 /*은 중요합니다.

  • 이 패턴 dir/은 이름이 지정된 디렉토리 dir와 그 아래의 모든 것을 (암시 적으로) 제외 합니다.
    를 사용 dir/하면 Git은 아래에있는 어떤 것도 보지 않으므로. 아래에있는 어떤 항목 dir에도 "제외 해제"패턴을 적용하지 않습니다 dir.
  • 패턴 dir/*dir그 자체 에 대해 아무것도 말하지 않습니다 . 아래의 모든 것을 제외합니다 dir. 을 사용 dir/*하면 Git은의 직접 콘텐츠를 처리하여 dir다른 패턴에 콘텐츠 일부 ( !dir/sub/)를 "제외"할 수있는 기회를 제공 합니다.

59856de 커밋 으로부터 스텐 Blees (kblees) 힘내 1.9 / 2.0 (Q1 2014) 경우 관계를 설명한다 :

gitignore.txt: 제외 된 디렉토리의 재귀 적 특성을 명확히합니다.

!패턴을 부정 하는 선택적 접두사 " "; 이전 패턴에서 제외 된 일치 파일은 다시 포함됩니다.

해당 파일의 상위 디렉토리가 제외 된 경우 파일을 다시 포함 할 수 없습니다. ( *)
( *: git 2.8+에서 특정 조건이 충족되지 않는 한, 아래 참조)
Git은 성능상의 이유로 제외 된 디렉토리를 나열하지 않으므로 포함 된 파일의 패턴은 정의 된 위치에 관계없이 영향을주지 않습니다.

리터럴 " "로 시작하는 패턴 \의 경우 첫 번째 " !" 앞에 백 슬래시 ( " ")를 추가 !합니다 (예 : " \!important!.txt").

특정 디렉토리를 제외한 모든 항목을 제외하는 예 foo/bar( /*슬래시가없는-기호는 와일드 카드도 안에있는 모든 항목을 제외 함 foo/bar) :

 --------------------------------------------------------------
     $ cat .gitignore
     # exclude everything except directory foo/bar
     /*
     !/foo
     /foo/*
     !/foo/bar
 --------------------------------------------------------------

귀하의 경우 :

application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**

지정된 폴더 내에서 파일을 화이트 리스트에 추가하려면 먼저 폴더 를 화이트리스트에 추가해야 합니다.


2016 년 2 월 / 3 월 업데이트 :

git 2.9.x / 2.10 (2016 년 중반?)을 사용하면 re-included 경로에 와일드 카드가없는 경우 해당 파일의 상위 디렉토리가 제외 되면 파일을 다시 포함 할 수 있습니다 .

Nguyễn Thái Ngọc Duy ( pclouds) 가이 기능을 추가하려고합니다.

따라서 git 2.9 이상에서는 실제로 작동 할 수 있었지만 궁극적으로 되돌 렸습니다.

application/
!application/language/gr/

@Chris Johnsen의 대답은 훌륭하지만 최신 버전의 Git (1.8.2 이상)에서는 좀 더 속기 솔루션에 활용할 수있는 이중 별표 패턴이 있습니다.

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

이렇게하면 추적하려는 하위 폴더의 상위 디렉토리를 "무시"할 필요가 없습니다.


Git 2.17.0 (이 버전 이전의시기는 확실하지 않습니다. 1.8.2로 돌아갈 수 있음)에서는 **파일로 이어지는 각 하위 디렉토리에 대해 excludes와 결합 된 패턴을 사용하여 작동합니다. 예를 들면 :

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder

이에 대해 비슷한 질문이 많이 있으므로 이전에 작성한 내용을 게시하겠습니다.

내 컴퓨터에서이 작업을 수행하는 유일한 방법은 다음과 같이하는 것입니다.

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

포함하려는 각 수준에 대해 콘텐츠를 명시 적으로 허용해야하는 방법에 유의하십시오. 따라서 테마 아래에 5 개의 하위 디렉터리가있는 경우에도 철자가 필요합니다.

이것은 @Yarin의 의견입니다 : https://stackoverflow.com/a/5250314/1696153

다음은 유용한 주제였습니다.

나는 또한 시도했다

*
*/*
**/**

**/wp-content/themes/**

또는 /wp-content/themes/**/*

나에게도 효과가 없었습니다. 많은 시행 착오!


나는 이것이 실제로 작동 한다는 것을 알았습니다 .

**/node_modules/*
!**/node_modules/keep-dir

그래서 많은 프로그래머가 node. 이 질문을 충족하는 사용 사례 는 예를 들어 node_modules하나의 모듈 을 제외 하고 제외하는 것입니다 module-a.

!node_modules/

node_modules/*
!node_modules/module-a/

특히 이전 Git 버전의 경우 대부분의 제안이 제대로 작동하지 않습니다. 이 경우 다른 설정에 관계없이 콘텐츠가 포함되기를 원하는 디렉토리에 별도의 .gitignore를 넣고 필요한 것을 허용합니다.

예 : /.gitignore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

따라서 /dependency_files(.dll 파일도 포함)의 모든 것이 잘 포함됩니다.


가장 간단하고 아마도 가장 좋은 방법은 파일을 수동으로 추가하는 것입니다 (일반적으로 이것은 .gitignore스타일 규칙 보다 우선합니다 ).

git add /path/to/module

플래그 추가하고 즉시 추가 할 것을 제안 -N 하기 위해 플래그 를 추가 할 수도 있습니다 . 아직 준비되지 않은 새 파일에 대해이 작업을 자주 수행합니다.


이것은 쉽게 중복 QA가 될 수있는 항목에 게시 된 답변사본입니다 . 가시성을 높이기 위해 여기에 다시 게시하고 있습니다. gitignore 규칙을 엉망으로 만들지 않는 것이 더 쉽습니다.


원하는 것을 정확히 얻기 ​​위해 디렉토리 구조를 걷는 또 다른 예입니다. 참고 : 나는 제외하지 Library/않았지만Library/**/*

# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme

> git add Library

> git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
    new file:   Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
    new file:   Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings

기본적으로 laravel에서 .gitignore별표를 사용하는 모든 것을 무시하고 공용 디렉토리를 재정의 하는 비슷한 경우를 발견했습니다 .

*
!public
!.gitignore

OP 시나리오가 발생하면 충분하지 않습니다.

당신의 특정 하위 폴더를 저지하려는 경우 public, 당신의 예를 들어 말할 public/products디렉토리에 포함시킬 하나 개의 하위 폴더에 깊은 예를있는 파일을 포함하려면 public/products/a/b.jpg이 같은 특별히 추가 할 경우에도 제대로 감지 못해 !/public/products, !public/products/*등 ..

해결책은 이와 같은 모든 경로 수준에 대한 항목을 추가하여 모두 재정의하는 것입니다.

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*

WordPress에서는 다음과 같은 도움이되었습니다.

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**

추가 답변 추가 :

!/.vs/              <== include this folder to source control, folder only, nothing else
/.vs/*              <== but ignore all files and sub-folder inside this folder
!/.vs/ProjectSettings.json <== but include this file to source control
!/.vs/config/       <== then include this folder to source control, folder only, nothing else
!/.vs/config/*      <== then include all files inside the folder

결과는 다음과 같습니다.

enter image description here


저는 CLI에서이 해결 방법을 자주 사용합니다. 여기서는를 구성하는 대신 디렉터리에 직접 또는 재귀 적으로 무시해도 포함 할 (하위) 디렉터리를 정의 .gitignore하는 별도의 .include파일을 만듭니다 .gitignore.

따라서 나는 추가로

git add `cat .include`

커밋하기 전에 스테이징 중.

OP에 .include다음 줄이 있는 a 사용하는 것이 좋습니다 .

<parent_folder_path>/application/language/gr/*

NOTE: Using cat does not allow usage of aliases (within .include) for specifying $HOME (or any other specific directory). This is because the line homedir/app1/* when passed to git add using the above command appears as git add 'homedir/app1/*', and enclosing characters in single quotes ('') preserves the literal value of each character within the quotes, thus preventing aliases (such as homedir) from functioning (see Bash Single Quotes).

Here is an example of a .include file I use in my repo here.

/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc

gitignore - Specifies intentionally untracked files to ignore.

Example to exclude everything except a specific directory foo/bar (note the /* - without the slash, the wildcard would also exclude everything within foo/bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Another example for WordPress:

!/wp-content
wp-content/*
!/wp-content/plugins
wp-content/plugins/*
!wp-content/plugins/my-awesome-plugin

More informations in here: https://git-scm.com/docs/gitignore


I wanted to track jquery production js files and this worked:

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*

참고URL : https://stackoverflow.com/questions/5533050/gitignore-exclude-folder-but-include-specific-subfolder

반응형