Git 저장소와 프로덕션 웹 사이트를 중단하지 않고 Drupal 코어를 업그레이드하는 가장 좋은 방법은 무엇입니까


13

모든 코드가 마스터 브랜치에있는 Git 리포지토리가 있는데 이전에 모든 Drupal 파일을 무시하고 있었기 때문에 내가 작성한 (또는 수정하거나 수정할 수있는) 코드와 코드를 엄격하게 구분했습니다. Drush 등으로 생성 될 수 있습니다.

Drupal을 업그레이드해야 할 때까지 이것은 좋은 전략처럼 보였다. 상황이 나빠지면 롤백하고 싶습니다 .Git보다 도구를 사용하는 것이 더 좋습니다. 나는 이것이 기능 브랜치에 대한 완벽한 상황이라고 생각했다. 그래서 브랜치를 만들고 모든 코드와 설정 파일을 무시하고 Drupal 설치의 일부인 파일에만주의를 기울 이도록 drupal-7.14자체적 .gitignore으로 주었다. 만지지 마십시오. robots.txt 및 .htaccess와 같은 경계 사례를 정렬하고 Drupal의 .gitignore를 내 자신으로 덮어 쓰면서 직접 다운로드 (다운로드, 압축 풀기, untar, 복사)했습니다. 500 오류에서 복구하기 위해 7.14에서는 작동했지만 7.15에서는 작동하지 않는 일부 설정을 수정 한 후 모든 것이 완벽 해 보였습니다. 지점의 이름을 바꾸고 drupal-7.15행복하게 가려고했습니다.

내가 실수로했던 것을 깨달을 때까지 : 마스터 브랜치에서 이전에 추적하지 않았지만 작업 디렉토리에 남겨진 파일은 이제 더 이상 추적되지 않은 파일이 아니기 때문에 마스터를 체크 아웃 할 때 작업 디렉토리에서 제거되었습니다! 도!

drupal-7.15지점을 마스터와 병합하면 코드 분리가 손실됩니다.

분기를 하위 모듈로 변환하는 방법이있을 수 있습니다. 가능하다고 가정하면, 이것이 최선의 전략 일 수 있습니다. 하위 모듈이 "올바른"솔루션이라는 것을 알기 전에는 이전에 추적되지 않은 파일에 분기를 사용하는 부작용을 인식하지 못했기 때문에 모서리를 자르고 해당 경로로 이동하기로 결정했습니다. (또한 Drupal에서 하위 모듈을 사용하는 것으로 보았던 모든 접근 방식은 새로운 프로젝트를 시작하고 Drupal이 마스터 브랜치가 될 것이라고 가정합니다. 다른 사람의 코드를 마스터 브랜치로 만드는 것은 바람직하지 않습니다. 마스터 지점이있는 리포지토리로 업그레이드하는 것만으로는 불필요하게 복잡해 보였습니다.)

내가 생각하지 않은 다른 해결책이있을 수 있습니다.

가장 적은 단점을 가지고 어떻게 이것을 가장 잘 복구 할 수 있습니까?

업데이트 : 이것은 내 랩톱의 Linux VM에서 개발 중이며 아직 프로덕션 환경으로 이동하지 않았습니다. 프로덕션으로 갈 때까지 모든 것이 기능 모듈로 마무리 될 계획이지만 아직 제자리에 있지 않습니다.

업데이트 2 : 하위 모듈 작동하지 않을 수 있습니다. Pro Git 에 따르면"하위 모듈을 사용하면 Git 저장소를 다른 Git 저장소의 하위 디렉토리로 유지할 수 있습니다". Drupal은 그러한 훌륭한 분리를 제공하지 않습니다. 모든 Drupal 코드가 서브 디렉토리에있는 대신, 관계가 다소 역전되지만 .htaccess와 robots.txt를 편집 할 수 있으므로 코드와 Drupal 저장소가 혼합되어 있기 때문에 아직 명확하게 구분되지 않습니다. 난 이 문제에 대한 해결 방법을 찾고 .


귀하의 질문은 실제로 자식에 관한 것입니다. Drupal이 아닌 사이트로 마이그레이션하면 더 나은 답변을 얻을 수 있다고 생각합니다. 업그레이드 정보 : 항상 새 디렉토리에 make 파일을 빌드하여 업그레이드를 수행 한 다음 이전에서 새 공용 디렉토리로 symlink를 업데이트하여 코드 롤백을 간단하게 만듭니다.
Letharion

2
@ 레타 리온 나는 동의하지 않습니다. 모든 사람은 현재 버전에서 새로운 버전으로 사이트를 업그레이드하는이 과정을 거칩니다. 모듈을 업그레이드하는 데 널리 사용되는 방법이므로 git을 사용하여 코어를 업그레이드하는 것이 일반적입니다. 내가 전에했던 것처럼 많은 사람들이이 문제로 어려움을 겪을 것입니다. 현재 웹에는이 문제를 해결하는 좋은 문서가 없으며 이것이 좋은 장소라고 생각합니다.
iStryker

명확히하기 위해, 나는 "Drupal을 업그레이드하기위한 최고의 pratice"에 대한 질문이 더 적합하다고 생각합니다.이 질문은 실제로 "git 실수를 어떻게 복구합니까?"라고 생각합니다. 그래도 주제에 대한 강한 감정이 없으므로 그 부분에 맡기겠습니다. :)
Letharion

알았어. 브랜든이 가진 문제는 상당히 흔합니다. 어쩌면 새로운 질문을 작성 하거나이 질문을 다시 작성해야합니다 (나머지 질문을 다른 질문으로 이동). 첫 2-3 문단이 일반적입니다. git repo 7.x-1.0을 작성하고 7.x-1.1로 업그레이드하려고합니다. 문제 파일은 .gitignore, .htaccess 및 robot.txt입니다. 때때로 당신은 그들이 수정 되었기 때문에 추적하기를 원하고, 때로는 당신은 그들이 수정 되었기 때문에 추적하기를 원하지 않습니다. 리포지토리를 업그레이드 할 때 새 분기를 만들거나 병합을 업데이트하거나 마스터를 업데이트하면됩니다. @ 레타 리온 제안?
iStryker

@ 레타 리온 : 나는 이것을 StackOverflow에 Git 질문으로 넣을지 여기 Drupal 질문으로 넣을지에 대해 생각했다. 내가 거기에 넣으면 모두가 불평하고 Drupal에 관한 것이라고 말할 것입니다. 그리고 나는 그들이 옳다고 생각합니다. Git이 상황을 복구하는 데 사용될 수 있지만 Drupal에 대한 지식에 따라 결정됩니다. 모든 Drupal 사용자는 Git을 사용하지만 그렇지 않은 경우 Git 사용자 중 일부만 Drupal을 사용합니다. Git에 대한 질문에 답하는 사람들은 Drupal 배경을 이해하지 못할 것입니다.
iconoclast

답변:


10

위의 토론에서 귀하의 질문은 git repo를 수정하는 것이 아니라 Drupal 사이트를 git으로 유지 관리하는 방법과 핵심 업데이트와 어떻게 작동하는지에 관한 것입니다.

표준 관행은 실제로 Drupal 코어를 포함한 모든 파일을 저장소에 보관하는 것이라고 생각합니다. Drupal 코드와 사용자 정의 코드를 분리하는 것은 좋은 생각처럼 보이지만 그것이 필요하다고 생각하지 않으며 그것이 어떤 이점을 제공하는지 알 수 없습니다. 또한 코어를 패치하고 싶지 않거나 배포의 일부로 수행하지 않아야한다고 가정하는 것 같습니다.이 방법은 모범 사례는 아니지만 문제가 발생하면 분명히 할 수있는 일입니다. 생산에서. 커밋을 잘 유지하고 집중하는 것도 이런 종류의 분리를 얻는 데 도움이됩니다.

내가 사용한 솔루션은 모든 코드를 동일한 리포지토리에 보관하고 기능 또는 다른 종류의 내보내기 / 코드 / 구성에 최대한 많이 넣고 외부에 적용해야 할 패치 목록을 유지하는 것입니다. -박스 코어 및 contrib.

코어를 업데이트 할 때 개발 환경에서 시작하십시오.

  • 작업 디렉토리가 깨끗한 지 확인하십시오
  • 최신 데이터베이스를 덤프하십시오 ( drush sql-dump). 덤프를 커밋하거나 안전한 곳에 저장하십시오.
  • 코어 업데이트 ( drush up drupal)
  • 모든 변경 사항을 커밋하십시오.
  • 패치 파일을 확인하십시오. 패치를 적용해야하는 경우 적용하고 다시 커밋하십시오.
  • 필요한 경우 update.php를 실행하십시오 (업데이트에 drush를 사용한 경우 이미 완료 됨)
  • 개발 사이트를 테스트하십시오. 모든 것이 정상이면 코드를 프로덕션으로 푸시하십시오. drush updb프로덕션에서 실행하십시오 .
  • 문제가 있고 되돌려 야 할 경우, repo를 되돌 리거나 재설정하거나 ( git reset --hard HEAD~2해야 할 경우) 기록을 유지하려면 두 커밋을 되돌립니다. 데이터베이스를 덤프로 바꾸십시오.

그렇지 않으면 업데이트로 데이터베이스에 대한 변경 사항을 취소 할 수 없으므로 데이터베이스 덤프가 필요합니다. 브랜치에서 업데이트를 수행 할 수도 있습니다.이 경우 되돌리기는 마스터를 확인하는 것을 의미합니다. 하나의 개발 사이트에서 작업하는 경우 데이터베이스로 인해 실제로 마스터로 다시 전환하고 병렬로 계속 작업 할 수 없기 때문에 약간 바람직하지 않습니다.

이보다 간단한 git-side workflow를 사용하면 서브 모듈 등의 복잡성없이 필요할 때 git의 최대 성능을 사용할 수 있습니다. 이것이 적절하지 않은 경우 코드를 더 분리 해야하는 이유를 설명 할 수 있습니까?


0

위의 의견 에서이 질문은 git을 사용 하여 Drupal 사이트 파일 을 유지 관리하는 방법과 핵심 업데이트와 함께 작동하는 방법에 관한 것입니다. 데이터베이스 백업 및 업그레이드에 대해서는 언급하지 않았습니다. 나는 goron 답변에서 아무것도 복사하지 않도록 노력할 것입니다.

이 문제에 대한 블로그 게시물을 만들었습니다. Git을 사용하여 웹 사이트에서 Drupal 코어 업그레이드

대체 방법

  1. Drush 명령 실행 drush up drupal
  2. 버전 간 차이 패치를 적용하십시오. 참조 http://drupal.org/node/359234 & http://fuerstnet.de/en/drupal-upgrade-easier

이것을 밝히지 않았지만 Drupal 버전 간의 변경 사항을 추적하려는 경우 branch 대신 태그 를 사용 하여이 작업을 수행합니다 . 업그레이드 커밋이 완료되면master에 코드에 7.x 태그를 지정하십시오.


올바르게 이해하면 모든 Drupal 핵심 코드를 동일한 저장소에 보관하는 것이 좋습니다. 이것은 컨센서스 인 것 같습니다. 나는 꺼리지 만, 그렇게하고 그렇게해야 할 수도 있습니다.
iconoclast

모두 하나의 저장소에 있습니다. 코어 / 메인 리포지토리 내에 자체 git repos 인 모듈, 프로파일 및 테마가 있습니다. 최선의 방법인지 모르겠지만, 내가 아는 가장 좋은 방법입니다.
iStryker

이 솔루션은 되돌아 갈 방법을 제공하지 않습니다. 투표에 대한 나의 이유.
Andre Baumeier

@ Serpiente : 되돌아 갈 방법이 부족한 이유가 왜 공감의 이유인지 모르겠습니다. 그것이 최선의 방법이라면 충분합니다. 그것이 최선의 방법이라고 생각하지 않는다면 그 이유를 설명하십시오.
iconoclast

@iconoclast 타임 라인으로 돌아갈 수없는 경우 개정 시스템의 문제는 무엇입니까? 예를 들어 실패한 업데이트에 대해 생각해보십시오. 여기서 복구하는 방법은 무엇입니까? "무엇이든"소프트웨어의 제공되는 버전에는 명확한 종속성이 있어야하며, 특히 프레임 워크 코어가 포함됩니다. 그렇지 않으면 git을 간단히 삭제하고 FTP 롤아웃을 다시 시작할 수 있습니다. 내 2 센트 만.
Andre Baumeier

0

OP와 마찬가지로 두 가지 분기로 설정을 실행하고 있습니다. 하나는 사용자 정의 코드 만 있고 하나는 내 사용자 정의 파일과 핵심 파일이 있습니다. 같은 상황이 발생했습니다. 분기 간을 전환 할 때 무시 된 코어 파일이 제거됩니다.

두 개의 동일한 git 디렉토리가 생겼습니다. 하나는 핵심 파일이 있지만 무시되는 사용자 정의 코드 작업을위한 것이고,이 디렉토리의 "전체"분기로 전환하지 않을 것입니다. 이 디렉토리 내에서만 분기 전환 및 병합을 수행하십시오.

이 두 분기 설정을 선택한 이유는 코어 파일에 대한 모든 로컬 커밋을 쉽게 추적하고 싶기 때문에 코어 파일을 업그레이드 할 때 코어 모드를 검사하고 다시 적용하기가 더 쉽기 때문입니다.

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