.gitignore를 사용하여 특정 디렉토리를 제외한 모든 것을 무시


140

내 문제는 내 자식 저장소에 WordPress 웹 사이트가 많이 있다는 것입니다.이 웹 사이트는 WordPress에 themes있는 나머지 중복 파일을 무시하면서 내 폴더 의 내용 만 선택적으로 커밋하려고합니다 .

이전에 .gitignore 파일을 사용하여 파일 형식을 무시했지만 다른 방법으로 사용할 수 있습니다. 즉 특정 폴더 경로를 무시하는 것입니까?

루트 (git repo)
-/ wordpress
--/ (WordPress Site 1) / wp-content / themes
--/ (WordPress Site 2) / wp-content / themes
--/ (WordPress Site 3) / wp-content / themes

감사-

최신 정보:

답변을 바탕으로 다음을 수행했지만 작동하지 않습니다. 어떤 아이디어?

# Ignore everything:
*
# Except for wordpress themes:
!*/wp-content/themes/*

또한 다음 변형을 시도했습니다.

!*/wp-content/themes*
!*wp-content/themes/*
!wp-content/themes/*
!/wordpress/*/wp-content/themes*
!wordpress/*/wp-content/themes*

이 중 어느 것도 내 themes폴더를 읽지 않습니다 .

답변:


133

내가 한 방법은 다음과 같습니다. 본질적으로 길을 걸어야하며 어떤 방향 으로든 여러 수준을 와일드 카드로 만들 수 없습니다.

# Ignore everything:
*

# Except for the themes directories:

!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 개의 테마 아래에있는 경우에도 여전히이를 설명해야합니다.

이것이 나를 위해 일한 방법입니다. 누군가가 더 많은 정보에 대해 설명을 제공하려는 경우.

또한, 이러한 답변이 도움이되었습니다.
어떻게 부정 패턴 작업 gitignore
어떻게 수행 gitignore 제외 규칙 실제로 작동


참고 : 나는 두 번 와일드 카드 'globs의'를 사용하지만 따라하려고 기능을 의존하는 시스템이 있고 내 Mac에서 일을하지 않았다 :

작동하지 않았다:

!**/wp-content/themes/
!**/wp-content/themes/**

4
자식 1.8.4하기 전에 **당신이 당신의 패턴에는 슬래시가없는 경우 와일드 카드는 workds 참조 sparethought.wordpress.com/2011/07/19/...을

작동해야합니다.!/wordpress/*/wp-content/themes/**/*
that0n3guy

1
이 구문은 Windows에서 작동합니까? 그것은 나를 위해 작동하지 않는 것 같습니다 ...
ScottF September

Windows 10에서 놀라운 기능을 수행합니다. Visual Studio Code의 모든 종류의 사용자 지정 프로젝트에 사용합니다.
klewis

나는이 답변과 @ 吴毅 凡에서 제공 한 답변을 조합하여 사용했습니다.
MikeyE

95

위의 방법을 시도했지만 제대로 작동하지 않았습니다. 더 좋은 방법은 다음과 같습니다. https://gist.github.com/444295

# This is a template .gitignore file for git-managed WordPress projects.
#
# Fact: you don't want WordPress core files, or your server-specific
# configuration files etc., in your project's repository. You just don't.
#
# Solution: stick this file up your repository root (which it assumes is
# also the WordPress root directory) and add exceptions for any plugins,
# themes, and other directories that should be under version control.
#
# See the comments below for more info on how to add exceptions for your
# content. Or see git's documentation for more info on .gitignore files:
# http://kernel.org/pub/software/scm/git/docs/gitignore.html

# Ignore everything in the root except the "wp-content" directory.
/*
!.gitignore
!wp-content/

# Ignore everything in the "wp-content" directory, except the "plugins"
# and "themes" directories.
wp-content/*
!wp-content/plugins/
!wp-content/themes/

# Ignore everything in the "plugins" directory, except the plugins you
# specify (see the commented-out examples for hints on how to do this.)
wp-content/plugins/*
# !wp-content/plugins/my-single-file-plugin.php
# !wp-content/plugins/my-directory-plugin/

# Ignore everything in the "themes" directory, except the themes you
# specify (see the commented-out example for a hint on how to do this.)
wp-content/themes/*
# !wp-content/themes/my-theme/

1
@ dwenaus- 이것을 공유해 주셔서 감사합니다-특정 워드 프레스 디렉토리에 뿌리를 둔 리포지토리에는 유용하지만 그 아래에 여러 워드 프레스 사이트가 있으면 작동하지 않습니다.
Yarin

이 구조 / 모델은 매우 유용합니다. Magento / WP 결합 설치를위한 단일 저장소를 원했고이 기술을 사용하여 30 줄 미만의 .gitignore를 사용하면 Magento 테마 / 스킨 파일과 WP 테마 파일로 범위를 좁힐 수있었습니다. 감사!
random_user_name

초보자 git 사용자가 들여 쓰기 영역 외부의 파일을 엉망으로 만들 수 있기 때문에이 설정을 자동 배포와 함께 사용하지 마십시오 (예 : 실수로 저장소의 모든 파일을 삭제하고 자동으로 배포하면 지저분해질 것입니다). 그 외에는 잘 작동합니다.
dwenaus

당신은 남자 친구입니다! 특히 버전이> = 2.1.4 인 경우. 참조 : git-scm.com/docs/gitignore/2.1.4
Haktan Suren

28

첫 번째 줄을 수정

*

로 변경

/*

2
이것은 나를 위해 일합니다. 내 .gitignore 파일은 다음과 같습니다 / *! .gitignore! / vendors
umbalaconmeogia

12

다음 답변을 시도하십시오.

.gitignore가 몇 개의 파일을 제외한 모든 것을 무시하게하십시오.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

하위 디렉토리를 제외한 모든 것을 무시하도록 Git에게 어떻게 지시합니까?

루트 파일과 루트 디렉토리를 무시한 다음 루트 bin 디렉토리를 무시합니다.

/*
/*/
!/bin/

이 방법으로 하위 디렉토리와 파일을 포함한 모든 bin 디렉토리를 얻을 수 있습니다.


@ irritate- 고마워, 이것들을 보지 못했지만, 내 상황에 적용하는 데 문제가 있습니다. 위의 내 편집 내용보기 ...
Yarin

1
내가 게시 번째 링크는이 둘 필요가 있다고 말한다 !*/wp-content/themes/!*/wp-content/themes/*. 그 변형을 시도 했습니까? 또한, 대안으로, 당신은 사용할 수있는 !*/wp-content/themes/각각의 테마 디렉토리에 자신의 .gitignore 파일이!*
자극

1
@ irritate- 아니 그 변형도 작동하지 않으며 어쨌든 나는 그것이 어떻게 다른지 볼 수 없습니다!*/wp-content/themes*
Yarin

9

패턴 앞에 느낌표 ( !)를 붙이면 패턴을 제외한 이전 패턴은 무시됩니다. 따라서 모든 것을 무시한 다음이 패턴을 사용하여 원하는 것을 허용 할 수 있습니다.


@ dappawit- 고마워-개념은 의미가 있고, 파일을 위해 작동하지만 테마 폴더는 작동하지 않습니다
Yarin

나는 glob 패턴에 대한 전문가는 아니지만 .gitignore 매뉴얼 페이지를 읽으면 이것이 효과가 있다고 생각합니다 !wordpress/[write out directories]/wp-content/themes/. 닫는 슬래시와 닫는 별표는 없습니다. 또한 *여러 디렉토리가 아닌 하나의 레벨에만 일치합니다. 매뉴얼 페이지는 다음과 같습니다. kernel.org/pub/software/scm/git/docs/gitignore.html
dappawit

다른 규칙 덕분에 부정을해야한다는 것을 알 수있었습니다.
Ax

6

하위 디렉토리가있는 하나의 폴더는 제외하고 모든 것을 무시해야했습니다.

나를 위해, 이것은 작동합니다

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt

5

다음과 같은 디렉토리 구조가 있다고 가정하십시오.

– sites
– -all
– – – -files
– – – – – -private
– – – – – – – -newspilot
– -default
– – – -files
– – – – – -private
– – – – – – – -newspilot

당신이하려는 경우 에만 사이트 / 모든 / 파일 / / 개인의 newspilot을 허용 하고 사이트 / 기본 / 파일 / / 개인의 newspilot을 , 당신은 처음에이를 시도 할 수 있습니다 :

sites/*/files/*
!sites/*/files/private/newspilot

이건 잘못이야! gitignore의 까다로운 점은 은 하위 디렉토리 ( "newspilot")를 커밋에 포함하기 전에 먼저 상위 ( "private") 디렉토리를 포함 시켜야한다는 것입니다.

sites/*/files/*
!sites/*/files/private
sites/*/files/private/*
!sites/*/files/private/newspilot

http://www.christianengvall.se/gitignore-exclude-folder-but-include-a-subfolder/


"자식 디렉토리를 허용하기 전에 먼저 상위 디렉토리를 포함시켜야합니다"-지적 해 주셔서 감사합니다! 정확히 내 문제였다.
제트 블루

4

Yarin의 대답이 나를 위해 일했습니다. 여기에 내 버전이 있습니다 ( /wordpress하위 디렉토리 가 필요하지 않습니다 ).

*

!.gitignore
!/wp-content/
!/wp-content/themes/
!/wp-content/themes/*
!/wp-content/themes/*/*
!/wp-content/themes/*/*/*
!/wp-content/themes/*/*/*/*
!/wp-content/themes/*/*/*/*/*

# I don't want to track this one, so it's included here, after the negated patterns. 
wp-content/themes/index.php

4

나는이 질문에 여러 번 돌아온 후에도 항상 어딘가에 붙어 있습니다. 단계별로 수행하는 자세한 프로세스를 생각해 냈습니다.

먼저 사용하십시오 git add 실제 콘텐츠를 추가하는 데 하십시오.

다른 모든 파일은 여전히 ​​추적되지 않은 상태에서 색인에 추가 된 관련 파일이 표시됩니다. 이것은 .gitignore단계별로 구성하는 데 도움이됩니다 .

$ git add wp-content/themes/my-theme/*
$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-admin/
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ...
        wp-includes/
        ...

DUMMY.TXT디렉토리에 임시 파일을 추가하십시오 .

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-admin/
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ...
        wp-content/themes/my-theme/DUMMY.TXT  <<<
        ...
        wp-includes/
        ...

우리의 목표는 이제 DUMMY.TXT우리가 끝났을 때 이것이 여전히 Untracked로 나타나는 유일한 규칙이 되도록 규칙을 구성하는 것입니다.

규칙 추가를 시작하십시오.

.gitignore

/*

첫 번째는 모든 것을 무시하는 것입니다. 추적되지 않은 파일은 모두 사라져야합니다. 색인화 된 파일 만 표시되어야합니다.

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

경로에 첫 번째 디렉토리 추가 wp-content

/*
!/wp-content

이제 Untracked 파일이 다시 표시되지만 wp-content의 콘텐츠 만

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ..

첫 번째 디렉토리의 모든 것을 /wp-content/*무시하고 무시하십시오!/wp-content/themes

/*
!/wp-content

/wp-content/*
!/wp-content/themes

이제 Untracked 파일은 wp-content/themes

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ..

해당 더미 파일이 여전히 추적되지 않은 것으로 표시 될 때까지 프로세스를 반복하십시오.

/*
!/wp-content

/wp-content/*
!/wp-content/themes

/wp-content/themes/*
!/wp-content/themes/my-theme

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/themes/my-theme/DUMMY.TXT

3

보다 깨끗한 솔루션을 찾는 사람들을 위해 다음을 시도하십시오.

답변 의 의견에서 언급 했듯이이 방법을 재귀 적으로 사용해야합니다.

이 예제에서는에서 웹 사이트 설정이 ./사용자의 위치를 .git폴더와 .gitignore파일 위치와의 워드 프레스 설치 설정을 ./wordpress. 테마 디렉토리 자체 ( )를 제외 하고 ./wordpress디렉토리 아래의 모든 것을 올바르게 무시하려면 허용하려는 디렉토리까지 각 디렉토리를 반복적으로 무시하고 허용해야합니다.wordpress/wp-content/themes/my-theme

wordpress/*
wordpress/wp-content/*
wordpress/wp-content/themes/*
!wordpress/wp-content
!wordpress/wp-content/themes
!wordpress/wp-content/themes/my-theme

와일드 카드를 무시하고 디렉토리 자체를 허용하거나 무시하는 이유는 Git이 디렉토리 내부를 먼저 무시하기 전에 디렉토리 내부를 먼저 살펴볼 수있게하는 이유입니다. 그런 다음 Git에게 지정한 디렉토리와는 별도로 모든 것을 무시하도록 지시합니다. 다음은 동일한 구문이지만 Git이 어떻게 보는지 순서대로 보여줍니다.

wordpress/*                            # Ignore everything inside here
!wordpress/wp-content                  # Apart from this directory

wordpress/wp-content/*                 # Ignore everything inside here
!wordpress/wp-content/themes           # Apart from this directory

wordpress/wp-content/themes/*          # Ignore everything inside here
!wordpress/wp-content/themes/my-theme  # Apart from this directory

잘하면 이것이 재귀 방법의 필요성을 더 잘 이해하는 데 도움이되기를 바랍니다.


3

파티에 늦었지만 알 수없는 깊이에 사용하는 것이 있습니다 (허용 된 솔루션에는 알려진 깊이가 필요합니다)

/*
!.gitignore
!wp-content/
!*/

이런 식으로 wp-content의 모든 내용은 무시되지 않습니다.


3

이것을 여러 번 필요로 한 후에 마침내 해결책을 찾았습니다 [1] :

/*/
/*.*
!.git*
!/wordpress

한 줄씩 설명 :

  1. 루트의 모든 디렉토리 를 무시하십시오 .
  2. 루트에 확장자가있는 모든 파일을 무시하십시오.
  3. .gitignore스스로를 (그리고 잠재적으로 .gitattributes) 허용하십시오 .
  4. 모든 서브 디렉토리 있는 원하는 디렉토리 허용

[1] 제한 사항 (알고 있음) :

  1. 루트에 확장자가없는 파일은 무시하지 않으며 추가 /*하면 전체 구성표가 손상됩니다.
  2. 4 행에 포함시키려는 디렉토리 ( wordpress이 경우)는 .이름을 가질 수 없습니다 (예 : wordpress.1작동하지 않습니다). 이있는 경우 .2 행을 제거하고 루트에서 모든 파일을 제외시키는 다른 방법을 찾으십시오.
  3. Windows에서만 테스트 git version 2.17.1.windows.2

3

또 다른 쉬운 해결책 :

테마를 제외한 모든 Wordpress 파일을 무시하려고합니다 (예 : 테마).

.gitignore , 내용은 다음과 같습니다.

# All wordpress + content of revert ignored directories
wordpress/*
wordpress/wp-content/*
wordpress/wp-content/themes/*

# Revert ignoring directories
!wordpress/
!wordpress/wp-content/
!wordpress/wp-content/themes/
!wordpress/wp-content/themes/my_theme

이 예에서는 .gitignore 가있는 경우 워드 프레스 를 제거 할 수 있습니다 . 루트 wordpress 디렉토리

지정된 폴더 / 파일에서 "예외적으로"유지하려는 모든 폴더 및 내용에 대해 정확히 동일한 작업을 수행 할 수 있습니다.

결론 :

무시하려는 경로의 모든 디렉토리를 무시하십시오.

그러나

무시하려는 무시되지 않은 디렉토리의 모든 내용을 무시하십시오


2

당신은 이것을 시도 할 수 있습니다 :

!**/themes/*

어디서 :

  • ! : 부정 무시 (포함)
  • ** : 모든 디렉토리 트리 (재귀)이므로 폴더 경로를 지정할 필요가 없습니다.
  • 테마 : 포함 할 폴더 (무엇이든 가능)
  • * : 해당 폴더의 모든 파일에는 **를 포함한 모든 하위 폴더를 포함 할 수 있으며 파일 (*)을 포함하는 대신 특정 * .css, * .xy 일 수 있습니다.

2

여기에 체크 아웃을 가정하는 내 솔루션이 있습니다. wp-content

# Ignore everything except directories
*
!*/

# except everything in the child theme and its required plugin
!/themes/mytheme-child/**
!/plugins/my-plugin/**

# and this file
!.gitignore

그리고 테스트 :

git version 2.20.1 (Apple Git-117)
$ git check-ignore -v .foo foo foo/ themes/foo themes/foo/bar themes/mytheme-child \
themes/mytheme-child/foo plugins/foo plugins/my-plugin plugins/my-plugin/foo .gitignore
.gitignore:2:*  .foo
.gitignore:2:*  foo
.gitignore:2:*  foo/
.gitignore:2:*  themes/foo
.gitignore:2:*  themes/foo/bar
.gitignore:2:*  themes/mytheme-child
.gitignore:6:!/themes/mytheme-child/**  themes/mytheme-child/foo
.gitignore:2:*  plugins/foo
.gitignore:2:*  plugins/my-plugin
.gitignore:7:!/plugins/my-plugin/** plugins/my-plugin/foo
.gitignore:10:!.gitignore   .gitignore

그래서 내가 원하지 않는 모든 것과 내가 지키고 싶은 것을 올바르게 무시합니다.

코드 해제

https://docs.gitlab.com/ee/workflow/repository_mirroring.html 에 따르면 Gitlab은 보호 된 브랜치를위한 리포지토리 미러로 구성됩니다

코드가 보호 된 분기로 푸시되면 베어 리포지토리 의 준비프로덕션 서버에 미러링됩니다 /opt/checkout/repo.git/. 다음 post-receive후크 (in /opt/checkout/repo.git/hooks/post-receive)는 작업 디렉토리로 코드를 체크 아웃합니다.

#!/bin/bash

BRANCH=staging
GIT_DIR=/opt/checkout/repo.git
GIT_WORK_TREE=/opt/bitnami/apps/wordpress/htdocs/wp-content

# on push, checkout the code to the working tree
git checkout -f "${BRANCH}"

# ensure permissions are correct
sudo chown -R bitnami:daemon "${GIT_WORK_TREE}"
sudo chmod -R go-w "${GIT_WORK_TREE}"

자세한 내용은 https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps를 참조 하십시오.


1

내가 한 방법은 다음과 같습니다.

# Ignore everything at root:
/*

# Except for directories:
!wordpress/(WordPress Site 1)/wp-content/themes/
!wordpress/(WordPress Site 1)/wp-content/themes/
!wordpress/(WordPress Site 1)/wp-content/themes/

# Except files:
!README

#Except files of type:
!*.txt

이것이 나를 위해 일한 것입니다. 특정 파일이나 폴더를 제외한 모든 것을 무시할 수 있습니다

맥 OS 시에라


0

나는 같은 보트를 타고 한 레포로 여러 Wordpress 사이트를 관리하려고합니다. 내 디렉토리 구조는 다음과 같습니다.

root (git repo)
(WordPress Site 1)/app/public/wp-content/themes
(WordPress Site 2)/app/public/wp-content/themes
(WordPress Site 3)/app/public/wp-content/themes

app/public각 사이트 의 폴더 내부 항목을 추적하고 싶습니다 . 나는이 페이지 의 샘플 과 여기에 제안 된 몇 가지를 시도하고 이것을 시도했습니다.

/(WordPress Site 1)/*
!(WordPress Site 1)/app
(WordPress Site 1)/app/*
!(WordPress Site 1)/app/public

어느 것이 효과가 있었지만 피하려고하는 각 사이트에 대해 동일한 경로를 무시해야합니다.

그런 다음 방금 사이트 이름을 바꾸었고 그게 *속임수였습니다. 그래서 이것이 내가 사용한 결과입니다.

/*/*
!*/app
*/app/*
!*/app/public

이것은 app/public루트에서 만든 모든 사이트 의 폴더에있는 모든 것을 캡처하면서 사이트 폴더의 모든 것을 효과적으로 무시했습니다 .

루트의 파일은 무시하지 않고 디렉토리 만 무시하십시오.

도움이 되었기를 바랍니다.


0

이것은 대부분의 경우 무시되는 유일한 파일입니다. 다른 파일과 공유 할 수있는 wp-config-sample.php가 있기 때문입니다.

/wp-config.php
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.