プロジェクト以下ならどこからでも実行できるコマンドなどで、ルートディレクトリからの相対 Path で決まったディレクトリやファイルを取得したい時があったりしました。
$ git rev-parse --show-toplevel
/Users/user/dirname
プロジェクト以下ならどこからでも実行できるコマンドなどで、ルートディレクトリからの相対 Path で決まったディレクトリやファイルを取得したい時があったりしました。
$ git rev-parse --show-toplevel
/Users/user/dirname
誰か他の人が削除したか何かでローカルにリモートブランチへの参照が残ってしまった場合。
git fetch --prune
# or git remote prune origin
以下のように設定するとfetch
だけでfetch --prune
と同じことがされるようになります。
git config --global fetch.prune true
これで取得できます。
git tag --sort=-taggerdate | sed -n 1p
--sort=-taggerdate
でタグを付けた日が新しい→古い順に並び替えができます。それをsed
で最初の1行目だけにしているだけです。
$ git tag 1
$ git tag 2
$ git tag 2
$
$ git tag
1
2
3
$ git tag --sort=-taggerdate
3
2
1
$ git tag --sort=-taggerdate | sed -n 1p
3
新しい参照を作る時に出た422(Unprocessable Entity)エラーは、ブランチ名をパスで見た時に親の名前でブランチを作ろうとしている為です。
既にディレクトリがある場所に同名でファイルは作れないように、参照はディレクトリの構造で管理されているので同じように参照ファイルを作ることができません。
git push origin master:parent/child
# Total 0 (delta 0), reused 0 (delta 0)
# To github.com:nju33/playground.git
# * [new branch] master -> parent/child
#
git push origin master:parent
# Total 0 (delta 0), reused 0 (delta 0)
# To github.com:nju33/playground.git
# ! [remote rejected] master -> parent (cannot lock ref 'refs/heads/parent': 'refs/heads/parent/child' exists; cannot create 'refs/heads/parent')
# error: failed to push some refs to 'git@github.com:nju33/playground.git'
ls -l .git/refs/remotes/origin
# drwxr-xr-x 3 nju33 staff 102 Aug 29 14:33 parent
echo a > .git/refs/remotes/origin/parent
# An error occurred while redirecting file '.git/refs/remotes/origin/parent'
# open: Is a directory
大抵はこれで持ってくるはずです。
git clone
これに、-b
オプションと保存先ディレクトリを指定してあげるだけです。
git clone -b
--single-branch
を指定するとリモート上のブランチなどを取ってこなくなります。
これでクローンしてくると、.git/config
ファイルが以下のようになっています。
[remote "origin"]
url =
fetch = +refs/heads/fix/:refs/remotes/origin/fix/
これが作業ブランチだとして、master
ブランチだけは定期的に取り込むために参照したいような場合は、このファイルのfetch
を追加します。
[remote "origin"]
url =
fetch = +refs/heads/:refs/remotes/origin/
fetch = +refs/heads/master:refs/remotes/origin/master
これでfetch
すれば取ってこれると思います。
$ git fetch
$ git branch -a
*
remotes/origin/
remotes/origin/master
# .git/modules/ を削除
git submodule deinit
# を消して、.gitmodulesからも情報をさく削除
git rm
# (今度はdevelopブランチで)再度追加
git submodule add -b develop
git rm
を先にやってしまった場合は、git submodule add -f
とすれば大丈夫です。
マークアップ系がコンフリクトを起こしてるけど、編集したのは自分じゃないし解決する自信あまりない。でもマージもできないのでCSSファイルなどを持ってきてUIを見ながら修正することもできない。
調べるとCSS関連のファイルではコンフリクトは起きてないので、これだけ持ってきちゃいたい。
for file in `git diff <比較ブランチ> --name-only | grep .css`; do git checkout develop $file; done
git diff --name-only
はファイル名だけを羅列するのでそれをgrep
でほしいファイルだけに絞り込み
git checkout <とあるブランチ> <filename>
でとあるブランチ状態のそのファイルの状態にチェックアウト
for...in
で上2つを繰り返し実行
これはhub
(github/hub)に依存してます。
Macの人はbrewで入れれます。
brew intall hub
以下で開けます。
hub browse -- pull/${PULL_NUMBER}
PULL_NUMBER
は見たいプルリクのid
です。
ただ多分プルリクのid
は覚えてないことが多いのであまり使えないですが、GitHubはPULL_NUMBER
がブランチ名の場合自動でid
に変換してくれる仕様があります。つまり、こんな感じでいけます。
hub browse -- pull/${BRANCH_NAME}
よく使うものとして、今いるブランチのプルリクを開きたいと思うかもしれませんが、それはこうします。git rev-parse --abbrev-ref HEAD
は今いるブランチ名を取得しています。
hub browse -- pull/`git rev-parse --abbrev-ref HEAD`
こんな感じで登録すると便利か…も?
function openpull () {
current_branch_name=`git rev-parse --abbrev-ref HEAD`
hub browse -- pull/${1:-$current_branch_name}
}
alias openpull=openpull
openpull
# 現在のブランチで開く
openpull foo
# fooブランチで開く
今master
ブランチでfoo
という Submodule は aaaaaa
というコミットが最新です。そしてそこから、update-submodule
というブランチを切って Submodule 情報を更新して、 bbbbbb
というコミットを最新にしました。
その後、git checkout master
で元ブランチに戻ると foo
ディレクトリに差分ができています。
git status
# On branch master
# Your branch is up to date with 'origin/master'.
#
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
# modified: foo (new commits)
これは以下のコマンドで直すことができます。 Submodule を最初期化する感じです。
git submodule update --init
cli で --recursive
オプションを使います。
git submodule update --init --recursive