git을 사용하면 한 브랜치에서 파일을 무시하고 다른 브랜치에서 커밋하려면 어떻게해야합니까? 있습니다 (웹 사이트는 내가 많이

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는 이런 종류의 작업에 효과적입니다 (예 : 원격 푸시에 포함되지 않은 파일의 로컬 사본 유지). 파일을 체크인 한 상태에서 분기로 전환 한 다음 다시 파일을 무시하고 분기하면 파일이 사라집니다.



답변

이 솔루션은 패치 된 특정 버전의 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


답변

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

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

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

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


답변

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


답변

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/


답변

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

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


답변

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 브랜치를 커밋합니다.

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


답변

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

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