git을 사용하면 한 브랜치에서 파일을 무시하고 다른 브랜치에서 커밋하려면 어떻게해야합니까?


157

Heroku에 배포하는 프로젝트가 있습니다. 소스 코드 트리에는 많은 mp3 파일이 포함되어 있습니다 (웹 사이트는 내가 많이 참여한 레코딩 프로젝트를위한 것입니다).

GitHub 에 소스 코드를 넣고 싶지만 GitHub의 무료 계정에는 300MB 제한이 있습니다. 많은 mp3 파일에 50MB의 제한을 사용하고 싶지 않습니다. 분명히, .gitignore파일을 파일에 추가하여 내 저장소에서 벗어날 수 있습니다.

그러나을 사용하여 Heroku에 배포합니다 git push heroku. mp3 파일은 Heroku로 푸시 한 지점에 있어야 배포 할 수 있습니다.

이상적으로는 .gitignore로컬 마스터 브랜치의 mp3 파일을 GitHub로 푸시하면 mp3가 포함되지 않도록 mp3 파일 을 원합니다 . 그런 다음 mp3가 무시되지 않고 커밋 된 로컬 프로덕션 브랜치를 유지합니다. 배포하려면 master를 프로덕션에 병합 한 다음 프로덕션 분기를 Heroku로 푸시합니다.

제대로 작동하지 않습니다.

여기 내가하려는 일의 예가 있습니다 ...

$ git init git-ignore-test
$ cd git-ignore-test
$ echo "*.ignored" >> .gitignore
$ git add .gitignore && git commit -m "Ignore .ignored files"
$ touch Foo.ignored

이 시점에서 Foo.ignored는 마스터 지점에서 무시되지만 여전히 존재하므로 프로젝트에서 사용할 수 있습니다.

$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"

이제 원하는대로 이러한 파일을 커밋 한 지점이 있습니다. 그러나 마스터 지점으로 다시 전환하면 Foo.ignored가 사라집니다.

더 좋은 방법을 제안하는 사람이 있습니까?

편집 : 명확히하기 위해 두 지점에 mp3 파일을 두어 사이트를 로컬로 실행할 때 (두 가지를 사용하여) 사이트가 작동하도록하고 싶습니다. 하나의 브랜치에서 파일을 무시하기를 원하므로 GitHub로 푸시 할 때 파일도 푸시되지 않습니다. 일반적으로 .gitignore는 이런 종류의 작업에 효과적입니다 (예 : 원격 푸시에 포함되지 않은 파일의 로컬 사본 유지). 파일을 체크인 한 상태에서 분기로 전환 한 다음 다시 파일을 무시하고 분기하면 파일이 사라집니다.


왜 MP3 파일은 않습니다 이제까지 저장소에 커밋해야합니까?
Dan Loewenherz 2009

4
heroku를 사용하면 리포지토리에 커밋하는 것이 배포 할 때 앱에 파일을 포함시키는 유일한 방법입니다. 유일한 대안은 mp3를 제공하기 위해 Amazon S3와 같은 것을 사용하는 것이지만, 나는 그것을 피하고 싶습니다.
Myron Marston

동전을 절약하기 위해 돈을
쓰지 않는 것처럼 들립니다

3
답변이 정답으로 표시되었지만 읽은 내용이 정확하지 않을 수 있습니다. 실제로 답을 시도해 보았습니까?
loop

2
주제 외 : 다른 오픈 소스 저장소 호스트 사용을 고려 했습니까? BitBucket 은 무료 계정에 있는지 여부에 관계없이 Git 리포지토리의 크기 제한이 없습니다 (크기를 이유 내에서 유지한다고 언급합니다). 리포지토리가 통제력을 벗어나지 않는 한 이것은 선택 사항 일 수 있습니다. 참고 : 저는 BitBucket과 관련이 없으며 행복한 고객입니다.
NightOwl888

답변:


84

이 솔루션은 패치 된 특정 버전의 git에서만 작동하는 것으로 보입니다. 참조 해결 방법에 대한 새로운 해답을 가리키는다른 답변 및 후속 의견 버전이 작동 힌트를 위해.

excludesfile공용 github 및 heroku 배포와 같은 다른 분기 에 효과적으로 사용하는 방법에 대한 블로그 게시물을 작성했습니다 .

빠르고 더러운 내용은 다음과 같습니다.

$ git branch public_viewing
$ cd .git/
$ touch info/exclude_from_public_viewing
$ echo "path/to/secret/file" > info/exclude_from_public_viewing 

그런 다음 .git / config 파일에서 다음 줄을 추가하십시오.

[core]
excludesfile = +info/exclude


[branch "public_viewing"]
excludesfile = +info/exclude_from_public_viewing

이제 모든 전역 무시 항목이 info/exclude파일에 있고 지점 특정이info/exclude_from_public_viewing

희망이 도움이됩니다!

http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches


1
시간이 오래 걸리 서 죄송합니다. .gitignore 파일을 삭제하지 않으면 기본값이 먼저 설정됩니다.
Cognition.Mind

4
프로젝트에서 .gitignore를 사용하지 않는 경우에도 이것은 작동하지 않습니다. 처음부터 ( git init, ...), 사용한 Git 버전을 설정하는 명령의 사본을 제공 하시겠습니까?
Davor Cubranic

34
이 솔루션은 작동하지 않습니다. 블로그에 대한 토론이 있었고 아무도이 작업을 수행 할 수 없었습니다.
spuder


2
바닐라 Git에서는 이것이 작동하지 않으며 결코 작동하지 않는다고 확신합니다. 이것을 재현 한 사람들은 Git 버전과 기타 관련 정보를 환경에 공유 할 수 있습니까? 배포판의 Git 패키지 관리자로부터 패치 된 버전이있을 수 있습니다.
Palec

20

중요한 힌트 : Cognition.Mind가 받아 들인 대답이 작동하지 않습니다 (더 이상, 몇 년 동안 또는 아마도 바닐라 버전의 git). 의견을 참조하십시오. 유효한 답변과 해결 방법은 여기에서 찾을 수 있습니다.

https://stackoverflow.com/a/29583813/2157640

또 다른 대안 (내 특정 문제에 대해서는 작동하지만 수동 숨김 작업이나 후크 구현이 필요함)은 다음과 같습니다 git stash -u -a. 차이가 크면 지루합니다.

그리고 마지막으로, 지금 진행중인 솔루션은 개발 환경을 유지하는 VM을 포크 info/excludes하고 브랜치에 적절하게 설정 하여 문제가있는 커밋되지 않은 파일 / 폴더를 각각 삭제합니다.


14

MP3 파일을 S3에 넣는 것이 좋습니다. 그것들을 Heroku 푸시의 일부 (따라서 Heroku 슬러그의 일부)로 만들면 dyno 시작 시간이 크게 느려집니다. Heroku는 EC2를 사용하므로 파일이 S3에 있고 앱에서만 액세스하는 경우 (사용자가 S3에 직접 연결되지 않은 경우) 대역폭 요금을 지불하지 않고 50MB를 저장하는 요금 만 지불합니다.


13

buildbranch를 제외한 다른 모든 브랜치에서 폴더 를 무시하고 싶다고 가정 해 봅시다 production. build프로덕션에서 폴더 를 푸시하려고합니다 .

1) build.gitignore에 포함 시키지 마십시오. 그렇게하면 모든 분기에 대해 항상 무시됩니다.

2) (이 폴더는 이미 존재합니다) 폴더 exclude_from_public_viewing안에 파일을 만듭니다../.git/infotouch ./.git/info/exclude_from_public_viewing

3) 내부에 exclude_from_public_viewing한 줄을 작성하십시오 ( build모든 가지 를 무시하려고 시도함에 따라 ). !build

4) 기존 파일이 .git/info/exclude있습니다. 다음 줄을 추가해야합니다.

 build

우리는 build폴더 를 무시하고 싶지만 .gitignore에 추가하지 않았습니다. 그래서 자식은 어떻게 무시할 것인지 알 것입니까? 답은 exclude파일에 파일을 추가 하고 조건부로 파일을 전달하는 것입니다.git config

5) 이제 분기에 build대한 폴더 를 조건부로 무시해야 합니다 production. 다음을 수행하기 위해

6) ./.git/config다음과 같은 파일 을 추가해야합니다.

a) excludesfile = +info/exclude아래[core]

[core]
     excludesfile = +info/exclude

B)의 끝에 새로운 섹션 만들기 ./.git/config등을

[branch "production"]
    excludesfile = +info/exclude_from_public_viewing

해결책 2

하나의 스마트 대체 솔루션이 있습니다. 지점 에 build/폴더 를 추가 production하고 다른 모든 지점 에서 폴더를 무시한다고 가정 해 봅시다.

1) gitignore파일에 추가 하십시오.

2) 생산 지점에서을 수행하는 동안 폴더를 git add강제로 추가하십시오 build.git add -f --all build/


그리고 이것은 어떻게 받아 들여지는 해결책과 다른가? 어떤 버전의 git으로 테스트 했습니까? 링크 된 답변에 따르면 branch.<name>.excludesfilegit (더 이상?)에 대한 지원이 없기 때문에 실패 core.excludesfile하고 내 테스트에서 이것을 확인하는 것처럼 보였습니다.
머피

@murphy 그것은 잘 작동 하고 내 솔루션에 git version 2.7.4 (Apple Git-66)사용하지 않았습니다 branch.<name>.excludesfile .
sapy

4
@ sapy : OP의 유스 케이스에 따라 이것을 시도했지만 프로덕션에서 마스터로 전환하면 파일이 여전히 사라집니다. "build"폴더는 "production"브랜치에 커밋되어야합니다. (또한, "production"브랜치에서 "build"폴더를 커밋하지 않으면 "production"브랜치는 "build"폴더의 존재를 무시합니다. 즉 [branch "production"] excludesfile config는 작동하지 않습니다). 나는 당신과 정확히 같은 버전의 자식을 사용합니다. 또한 머피가 말한 것처럼 프로덕션 브랜치에서만 파일 을 무시 하기 위해 [브랜치 "production"] 접근 방식을 시도했지만 작동하지 않습니다.
justhalf

솔루션 2는 내가 찾고있는 것입니다. 감사!
Vyacheslav Cotruta

4

지점에서 .gitignore를 다르게 해 보셨습니까?

해당 지점에서 파일을 추적하지 않는 한 지점에 따라 원하는 것을 무시할 수 있어야합니다.


6
나는 그것을 시도했다. 위에 게시 한 명령을 보면 정확히 내가 한 일을 볼 수 있습니다. 문제는 파일을 체크 인한 지점에서 파일을 무시하고 지점으로 전환하면 git이 파일을 버린다는 것입니다. 파일을 무시하더라도 사이트가 개발자 모드에서 제대로 작동하도록 마스터 브랜치에 mp3를 유지하고 싶습니다.
Myron Marston

1
그는 이미 그가 한 일을 말했다. 어쩌면이 답변을 삭제하는 것이 가장 좋습니다 :-) 원인을 산만하게합니다.
blamb

3

1. 요약

  1. 내가 사용하는 트래비스 CI를 위해 배포 ( 는 Heroku가 배포를 지원합니다 )
  2. 나는 내 추가 .travis.yml:

    before_deploy:
    - mv misc/.gitignore .gitignore

    여기서 misc— 모든 폴더에 다른 폴더가 포함되어 있습니다 .gitignore.

    mvUNIX 명령 이동 파일; 파일이 이미 있으면 덮어 씁니다.

Travis CI가 프로젝트를 배포 할 때 Travis CI 는 원본 소스가 아닌 무시하는 공급자 파일 및 폴더 를 배포misc/.gitignore 하지 않습니다 .gitignore.


2. 한계

  1. 이 답변은 저자의 모든 조건에 적합하지 않을 수 있습니다. 그러나이 답변은 "git을 사용하면 한 브랜치에서 파일을 어떻게 무시하고 다른 브랜치에서 커밋합니까?"
  2. 저는 Heroku가 아닌 GitHub 에 대한 예인 Heroku 사용자가 아닙니다. 이 답변의 데이터는 GitHub에서 작동하지만 Heroku에서는 작동하지 않을 수 있습니다.

3. 관련성

이 답변은 2018 년 4 월과 관련이 있습니다. 향후이 답변의 데이터는 더 이상 사용되지 않을 수 있습니다.


4. 시연

실제 프로젝트 .

성공적인 배치의 예 .

4.1. 직무

src 브랜치에서 동일한 리포지토리의 dest 브랜치로 프로젝트를 배포합니다.

나는 그 파일을 원한다 PaletteMira.suricate-profile.

  • 로컬 머신 — 모든 지점에 존재합니다.
  • src 원격 브랜치 — 존재하지 않습니다.
  • 원격 지점 — 존재합니다.

질문의 저자를 올바르게 이해하면 그는 비슷한 임무를 수행합니다.

4.2. src

소스 브랜치 — SashaYAML .

의 일부 .travis.yml:

before_deploy:
- mv misc/.gitignore .gitignore

deploy:
  provider: pages
  on:
    branch: SashaYAML
  keep-history: true
  skip-cleanup: true
  target-branch: SashaDevelop
  repo: Kristinita/PaletteMira
  github-token: $GITHUB_TOKEN
  committer-from-gh: true
  project-name: PaletteMira
verbose: true

의 일부 .gitignore:

*.sublime-snippet
*.suricate-profile

부분의 misc/.gitignore

*.sublime-snippet

*.suricate-profile에 없습니다 misc/.gitignore.

PaletteMira.suricate-profile 이 분기에는 원격으로 존재하지 않지만 로컬로 존재합니다.

4.3. 대상

목적지 지점 — SashaDevelop

의 일부 .gitignore:

*.sublime-snippet

*.suricate-profile에 없습니다 misc/.gitignore.

PaletteMira.suricate-profile이 지점에 대해 원격 및 로컬로 존재 합니다.

4.4. 재현 단계

Travis CI에 PaletteMira GitHub 리포지토리를 활성화하고 환경 변수 $GITHUB_TOKEN 를 값으로 설정 GitHub 토큰 → src 브랜치를 커밋합니다.

오류가 없으면 예상되는 동작을 가져와야 합니다.


0

Heroku에서 커밋하고 푸시 할 수 있습니까?

예를 들어 오디오를 추가하고, github 및 heroku로 푸시 한 다음 Heroku의 작업 복사본에서 파일을 제거하십시오. 디스크가 아닌 리포지토리에서 오디오를 제거한 다음 해당 변경 사항을 다시 github으로 푸시하십시오.


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