답변:
이것은 종종 가장 좋은 방법입니다.
( cd dir ; git init )
또는
( cd dir && git init )
꽤 짧고 입력하기 쉽습니다. 하위 셸을 시작하므로 환경을 수정할 수 없지만 여기서는 문제가되지 않습니다.
$?
서브 쉘에서 실행 된 마지막 명령의 종료 코드가 포함됩니다. &&
변형 을 사용하는 경우 (보통해야 함) 실패한 첫 번째 명령의 종료 코드를 얻습니다 (또는 모두 정상적으로 진행되면 0).
경로에서 git 명령을 실행하고 다른 경로에서 저장소를 변경하는 방법을 찾고있었습니다. 그래서 나는이 질문에서 끝났습니다.
그러나 내 특정 요구에 대해서는 허용 된 답변이나 다른 답변 중 어느 것도 도움이되지 않았습니다.
나는 sudo -u USER /usr/bin/git
(다른 사용자가 그것을 사용하여) git 명령을 실행해야했다. 아시다시피 sudo는 cd
명령 을 실행할 수 없으므로 저장소 디렉토리에 있을 수 없습니다 .
그래서 나는 git 's man page에 갔다 . 그리고 옵션들 중에서 나는 --git-dir=<path>
:
--git-dir =
저장소 경로를 설정하십시오. GIT_DIR 환경 변수를 설정하여 제어 할 수도 있습니다. 현재 작업 디렉토리에 대한 절대 경로 또는 상대 경로 일 수 있습니다.
따라서 누군가에게 도움이 되더라도 경로에서 git을 사용하고 "먼 곳에서"저장소를 변경할 수 있습니다. 그냥 사용하십시오 :
git --git-dir=/path/to/repository GIT_COMMAND
또는 다른 사용자로 실행하려면 다음과 같이하십시오.
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository GIT_COMMAND
또한 git-init 매뉴얼 페이지에서 :
$ GIT_DIR 환경 변수가 설정되면 리포지토리의 기본에 ./.git 대신 사용할 경로를 지정합니다.
따라서 일반적인 .git 폴더 아래에 리포지토리를 초기화하려면 --git-dir
옵션 과 함께 지정해야합니다 . 예 :
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
on on 저장소를 초기화 한 후 git 's man page에 설명 된대로 /path/to/repo/.git
모든 추가 명령에는 옵션이 있어야합니다 --work-tree=<path>
.
--work-tree =
작업 트리의 경로를 설정하십시오. 절대 경로이거나 현재 작업 디렉토리에 상대적인 경로 일 수 있습니다. 이것은 또한 GIT_WORK_TREE 환경 변수 및 core.worktree 구성 변수를 설정하여 제어 할 수 있습니다 (자세한 설명은 git-config (1)의 core.worktree 참조).
따라서 다른 사용자로 git을 실행하고 새 저장소를 초기화하는 올바른 명령은 다음과 같습니다.
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' add /path/to/repository/*
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' commit -m 'MESSAGE'
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' remote add origin user@domain.com:path
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' push -u origin master
sudo -i
하거나 sudo su
얻을 수 있습니다.
( cd subdir && sudo -u USER /usr/bin/git init )
작동하지 않을지 상상할 수 없습니다 .
subdir
어떻게합니까?
아니 정확히 당신이 (당신이 서브 쉘로 위의 실제 답변을) 요청 만보고있어 pushd
와popd
몇 가지 옵션이 있습니다. &&
또는로 명령을 그룹화 할 수 있습니다 ;
. 이처럼 :
cd subdir && git init && cd ..
또는
cd subdir; git init; cd ..
차이점은 첫 번째 예에서 명령 중 하나가 실패하면 나머지 명령은 실행하지 않는다는 것입니다. 두 번째 예에서는 모든 명령이 무엇이든 실행됩니다.
다른 옵션은 함수를 정의하고 사용하는 것입니다. 예를 들면 다음과 같습니다.
function cdinit() {
cd $1
git init
cd ..
}
그런 다음 명령을 실행할 수 있습니다.
cdinit subdir
그리고 자동 git init
으로 해당 디렉토리에 들어가서 빠져 나옵니다.
많은 디렉토리가 있고 git init
하나의 명령 으로 디렉토리를 원할 경우 함수를 사용하여보다 복잡한 솔루션을 수행 할 수도 있습니다 .
function cdinit() {
for arg in $@
do
cd $arg
git init
cd ..
done
}
그런 다음 다음을 사용하여 실행할 수 있습니다.
cdinit subdir1 subdir2 subdir3
그리고 그것은 할 것입니다 git init
에 subdir1
, subdir2
그리고 subdir3
.
&&
하고 ;
, 그러나 더 우아한 뭔가를 희망했다. 스크립트를 작성하는 것이 가장 좋습니다.
cdinit
임의의 명령에 대해 함수를 일반화 할 수 있다고 생각하십니까 ? 나는 인수를 사용하려고 시도했지만 작동하지 않았습니다.
;
하므로 세 줄 함수는와 같습니다 cd $1; git init; cd ..
. (2) 당신은 당신의 변수를 인용한다 : "$1"
, "$@"
및 "$arg"
. 또는 당신은 생략 할 수 있습니다 for arg in "$@"
로 for arg
.
의 경우 git
(적어도 버전 2.7.0에서), 당신이 활용할 수있는 -C
가 주어진 디렉토리에서 시작 것처럼 자식 동작합니다을 만드는 옵션을 선택합니다. 따라서 솔루션은 다음과 같습니다.
> git -C subdir init
Initialized empty Git repository in /some/path/subdir/.git/
문서 인용하기 :
Run as if git was started in <path> instead of the current working directory. When multiple -C options are given, each subsequent non-absolute -C
<path> is interpreted relative to the preceding -C <path>.
This option affects options that expect path name like --git-dir and --work-tree in that their interpretations of the path names would be made
relative to the working directory caused by the -C option.
&&로 명령을 그룹화 할 수 있습니다.
cd subdir && git init && cd ../
각 명령의 종료 코드에 의존하지 않으려면; 대신, 즉 :
cd subdir ; git init ; cd ../
;
이전 코드의 리턴 코드에 의존하지 않도록하십시오.
cd subdir && git init ; cd ..
실제로 가장 의미가있을 수 있습니다. 사용자가에서 git init
명령 subdir
을 실행하려면 현재 디렉토리에서 명령을 실행하지 않을 것입니다. 즉, 그들은 (첫 번째) cd
실패하면 실행하고 싶지 않습니다. ( cd
우리가 이미 에 있기 때문에 실패가 가능할 수도 있지만 그것은 subdir
모퉁이의 경우입니다.) ... (계속)
cd
경우 git init
명령이 실패 하더라도 시작 디렉토리 로 백업 할 수 있습니다 . ( 또는 그들이 하위 디렉토리에 머물면서 명령 실패를 진단 할 수 있습니다.) (2) 당신은 포함 할 필요가 없습니다 /
후를 ..
.
명령에 파일 이름 또는 디렉토리 이름 매개 변수가없는 경우 대상 디렉토리로 홉해야합니다.
그러나 대상 디렉토리와 명령을 매개 변수로 사용하는 bash 스크립트를 작성할 수 있습니다. 이를 위해 푸시 및 팝을 볼 수 있습니다 : http://ss64.com/bash/pushd.html
나는 당신을 위해 그 작은 스크립트를 쓸 것이지만, 나는 여기에 리눅스 박스가 없다 :)
프로그램은 인수를 처리하는 방법이 다르므로 일부는 -folder = name 옵션 과 동일 합니다. 그 예외 외에도 MS DOS에서도 표준은 간단합니다.
$ 프로그램 하위 디렉토리
때때로 당신은 필요
$ 프로그램 하위 디렉토리 /
프로그램은 폴더를 열고 파일 작업과 같은 방식으로 작업하며, 완료되면 원래 표준 디렉토리를 가리키는 셸로 제어를 되돌립니다. 이러한 방식으로 처리 된 프로그램에는 코어 덤프와 같은 오류 출력이 subdir 대신 쉘의 현재 디렉토리에있는 파일로 이동하는 문제가 있습니다.
프로그램에 다른 장소를 지정하는 데 사용할 수있는 명령 스위치가 없으면 해결 방법이 없습니다. 일부 프로그래머는 "디렉토리 프로그램이에서 호출되었습니다 "와 "디렉토리 프로그램이 에서 작동하도록 지시되었습니다 " 사이에서 예술적 라이센스 를 받습니다.