자식으로 새 파일의 일부만 준비하는 방법은 무엇입니까?


221

나는 git add --interactive를 좋아한다 . 이제는 일상적인 워크 플로의 일부입니다.

문제는 추적되지 않은 파일에서는 작동하지 않는 것 같습니다. 내가 원하는 것은 새 파일을 추적하는 것이지만 파일의 일부만 추가하는 것입니다. 즉이 새 파일의 일부는 아직 준비되지 않았습니다.

예를 들어, git add -i를 사용하면 패치 옵션을 선택하고 새 코드의 일부를 스테이징하기 위해 개별 덩어리를 편집 할 수 있으며 디버그 코드 주석은 스테이징되지 않습니다. 현재 작업중 인 메가 패치의 어느 부분에 여전히 작업이 필요한지 분명하기 때문에이 방법으로 작업하는 것을 좋아합니다.

불행히도, 나는 추적되지 않은 파일로 똑같이 할 수없는 것 같습니다. 전체 파일을 준비하거나 아무 것도 설정하지 않습니다. 내가 사용한 해결 방법은 비어있을 때 새 파일을 준비하거나 커밋 한 다음 일반적인 방식으로 개별 변경 사항을 준비하는 것입니다. 그러나이 솔루션은 더러운 해킹처럼 느껴지고 잊어 버릴 때나 마음을 바꿀 때보 다 더 많은 문제가 발생합니다.

질문은 : 새 파일의 일부만 준비하는 방법입니다. 그러면이 새 파일은 추적되지만 내용의 전체 또는 일부는 준비되지 않은 상태로 유지합니까?

답변:


415

우와, 모든 update-indexhash-object사업이 지나치게 복잡해 보인다. 어떻습니까?

git add -N new_file
git add -i

보낸 사람 git help add:

-N, --intent-to-add
    Record only the fact that the path will be added later.  An entry
    for the path is placed in the index with no content.  This is useful
    for, among other things, showing the unstaged content of such files
    with git diff and committing them with git commit -a.

9
++ 1! 적법한 신용. 나는 지금까지 이러한 맨 페이지를 알고 너무 많이 믿습니다 ....</shame>
sehe

1
잘 찾았습니다. 매뉴얼 페이지를 조금 더 스크롤해야합니다. 아마도 Git Pro 배지를 반환해야 할 것입니다.
dave1010

3
왜 git-gui가 이것을 내부적으로 사용하여 새 파일에서 라인을 스테이징 할 수 없는지 궁금합니다.
Deiwin

6
멋진 -N발견, 감사합니다! -p이 경우에 결합하는 것을 선호하지만 . gid add -N the_file& git add -p. 하나는 추가해야합니다 -N또한 작동-A
시릴 CHAPON

@Deiwin-.gitconfig에 [guitool]을 추가하여 "git add -N $ FILENAME"을 수행 할 수 있습니다. [guitool "intent와 함께 추가"] cmd = "git add -N $ FILENAME"needsfile = yes noconsole = yes
Steve Folly

7

가장 쉬운 방법은 일반적으로 imho 대화식 스테이징입니다 git gui. git과 함께 제공되며 git에서 지원하는 거의 모든 플랫폼에서 작동해야합니다.

간단히 실행 git gui하면 GUI가 열리 며, 덩어리를 스테이징 및 언 스테이징 할 수 있으며 심지어 한 줄의 추적 및 추적되지 않은 파일도 가능합니다.

힘내 Gui


이것은 독창적 인 답변이며 때로는 매우 유용합니다.
Pablo Olmos de Aguilera C.

3
모든 자식 배포판에 포함되어 있지는 않습니다 git gui. 예를 들어 데비안에서는 'git-gui'라는 별도의 패키지에 있습니다.
cristoper

년 동안이 기능 (하드 충분하지)를 찾고있다, 이것은 생명 체인저입니다
austinmarton

2
나를 위해 추적되지 않은 파일의 한 줄을 준비하는 것은 git gui결코 효과가 없었습니다. 실제로 이러한 메뉴 옵션을 비활성화합니다 .
Deiwin

2
@Deiwin 나는 실제로 질문에서 이것을 놓 쳤어 야한다 – 나의 스크린 샷은 이미 추적 된 파일을 보여준다. git gui새 파일 에 사용 하려면 git add -N new_file먼저 실행해야합니다 . Richard Hansen의 답변을 참조하십시오.
Chronial

6
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
git add --interactive newfile

간단한 데모 :

mkdir /tmp/demo
cd /tmp/demo
git init .

echo hello > newfile
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
  • 힌트 만약 'empty'blob이 이미 git object database에 존재한다면, e69de29bb2d1d6434b8b29ae775ad8c2e48c5391대신 hash 를 하드 코딩 할 수 있습니다. 그렇게하지 않는 것이 좋습니다 _
  • 힌트 Windows를 사용 NUL:하는 경우 대신 대신 사용할 수 있습니다 /dev/null. 그렇지 않으면 다음과 같은 것을 사용하십시오echo -n '' | git hash-object --stdin -w

이제 색인 newfile에 빈 얼룩이 포함 되며 비어있는 얼룩이 존재하지 않는 경우 개체 데이터베이스에 입력 된 것입니다.

$ find .git/objects/ -type f 
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   newfile
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   newfile
#

$ git diff
diff --git a/newfile b/newfile
index e69de29..ce01362 100644
--- a/newfile
+++ b/newfile
@@ -0,0 +1 @@
+hello

이것은 정확히 원하는 것이어야합니다. 나는 또한 매우 지능 지수 관리를 위해 정력 도망자 플러그인을 권고 할 수있다 (참조 더 나은 -p 추가 GIT? )


1
이것은 잘 작동하는 것 같습니다. 기억하기 조금 복잡하기 때문에 "stage-empty-file"로 별칭을 지정했습니다.
dave1010

@ dave1010 : 도움이되어 다행입니다! 예, 별칭 추가에 대해 생각했지만 일반적으로 와일드 카드 또는 여러 파일 이름 인수를 처리하는 방법을 알지 못했습니다. 그래서 나는 선택하지 않았다
sehe

2

편집 : 이것은 현재 작동하지 않는 것 같습니다. 나는 그것이 이전 (git 1.7.1에서) 확신합니다. 작동하지 않는 경우 /dev/null위의 제안대로 스테이징 을 제안합니다.

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile

Windows를 사용하지 않는 경우 ()없이 /dev/null빈 파일의 경로로 바꿀 수 있습니다.

원래 답변

당신이 원하는

git add -p # (or --patch)

이것은 나를 위해 추적되지 않은 파일을 추가합니다. 매뉴얼 페이지에서 :

색인과 작업 트리 사이에서 대화식으로 패치 덩어리를 선택하여 색인에 추가하십시오. 이를 통해 사용자는 수정 된 내용을 색인에 추가하기 전에 차이점을 검토 할 수 있습니다.

add --interactive를 효과적으로 실행하지만 초기 명령 메뉴를 무시하고 직접 patch 하위 명령으로 이동합니다. 자세한 내용은 "대화식 모드"를 참조하십시오.


2
그러나 흥미로워, 그것은 나를 위해 작동하지 않습니다 (git 1.7.4); git add -p newfile전혀 작동하지 않으며 (nu effect) git add --interactive'[a] dd untracked'는 그 영향을 미칩니다 git add newfile. 편집 은 git 1.7.5.3으로도 확인되었습니다. 주사위 없음
sehe

Windows를위한 좋은 힌트, 내 대답에 힌트를 추가했습니다. Thx
sehe

-3

또 다른 가능성의 기록을 위해 : 나는

git add -N file
git add -p file

그런 다음 덩어리를 준비하거나 제자리에서 편집 할 수 있습니다.


1
이 답변은 수락 된 답변과 동일하며 2011 년으로 거슬러 올라갑니다. Downvote.
Stanislav Pankevich

허용되는 답변은와 결합 add -N됩니다 add -i. 방금 작품 add -p대신 추가했습니다 add -i.
Pedro Adame Vergara
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.