2016-06-23 4 views
2

私はRPMを作成するためのビルドプロセスを持っています。チームはrpmのリリース番号を使用してバージョン情報を追跡します。彼らは<program_name>-<version>-<rel_num>.<os_type>.<arch>.rpmのように見えます。以下は、該当する場所:gitの状態はスクリプトのブランチを切り替えることで混乱します

  • バージョンセマンティックバージョンパターンMAJORです。 MINORPATCH
  • rel_num
  • OS_TYPEが期待x86_64のか何を持っているとしてEnterprise Linux用の7
  • アーチをEL7され、それが独特作るために、単純にリビジョンコントロールに格納されているすべての増加する整数でありますあなた

私が取り組んでいるプロジェクトは、そのソースがgitに保存されています。このRPMのリリース番号プロセスは、Subversion(私たちのチームがサポートしているほとんどのプロジェクトが存在する)から継承されています。

一意性を維持するために、rpm_build_numという名前のファイルを含む一意のディレクトリを持つプロジェクトのために、rpmというブランチを作成しました。このファイルはで、rpmブランチにはしか存在しません。 makeプロセス中に、rpmブランチをチェックアウトするためにBASHスクリプトが呼び出され、存在しない場合はorigin/rpmに基づいて新しいブランチを作成します。ビルド番号を増分してからリモートに戻します。これが完了すると、スクリプトは終了する前にブランチを復元します。簡単なBASHで

storedBranch=$(git branch | awk -e '/^\*/{print $2}') 
git branch | grep -q rpm 
if [[ ${PIPESTATUS[1]} != 0 ]]; then 
    git checkout -b rpm origin/rpm 
else 
    git checkout rpm 
fi 

# fetch and merge origin/rpm if needed 

cd path/to/dir 
echo (($(cat rpm_build_num) + 1)) > rpm_build_num 
git add rpm_buid_num 
git commit -m "incrementing the build number" 
git push origin rpm 
cd - 

git checkout ${storedBranch} 

の問題は、私はまだ理解していない理由のために、時々、makeプロセスのために、シェルプロンプトから起動、ということである、それは実際に使用していた枝に関して失われます。私は、このスクリプトのように、すべてのブランチに存在するディレクトリからさまざまなことを開始するために、このプロセスのあらゆる段階で非常に注意しています。しかし、私はまだ時間でこれを参照してください。makeが、コメントの行のカップルを処理している間

shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory 

上記のエラーが4または5回を出力します。私はいくつかの試みでこれを修正して運がなかった。私のインターネット検索では、「ブランチを使って作業する」、または「ブランチを切り替える」というようなもので多くの結果が得られましたが、これは正確には関係ありません。私は別のブランチ上のファイルを更新することができないので、実際にそのブランチに変更せずにコミットしてプッシュします(私はその質問に対する答えを見つけました)。

+0

'git checkout -b rpm origin/rpm'や' git checkout rpm'が失敗する可能性はありますか? – ElpieKay

+0

チェックアウト後に 'sync; sync; sync'を実行しようとするか、またはファイルシステムの同期を取得するためにスリープ状態にしますか? – YOU

+0

@ElpieKay良い質問です。実際のスクリプトは、チェックアウトを実行した後に '$?'をチェックします。スクリプトが失敗し、理由が標準出力に出力された場合、この時点でスクリプトは最終的に退くことになります。 –

答えて

0

簡潔に言えば、getcwd: cannot access parent directories: No such file or directoryは、もう存在しないディレクトリで何かをしようとしていることを意味します。これは、いくつかの方法で起こることができますが、変更の枝を言及するので、このような何かが起こる:

あなたのレポは、レイアウトを持っています

repo_path/ 
    +- a <- you're here 
    \- b 

あなたが別のブランチやレイアウトの変更をチェックアウト:

repo_path/ 
    +- b 
    \- c 

'a' exists only in memory now, but you're still in it 

make-getcwdが失敗します。

私はこれがあなたのスクリプトの中で起こっているポイントを推測することはできませんが、一般的に、私はあなたがcdのgitコマンドを実行する前にルートをリポジトリに確認することをお勧めすることができます。あなたがすべての操作のベースとしてそれを保持する場合、状態/場所について混乱するのは難しいでしょう。

+0

私はEL7で使用しているgitのバージョンと最も関連があるので、答えとしてマークされています。実際には、この答えと@YOUの睡眠の提案をスクリプトで同期させて使う解決策を作りました。有望なこの外観の予備テスト。 –

0

可能な回避策は、チェックアウトが完全に行われないようにすることです。つまり、ブランチを切り替える必要がなくなります。これは、既にチェックアウトされているためです。

git 2.5以降では、use multiple working treeです。
ブランチごとに1つずつ作成する(2番目の作業ツリーにはgit worktree addを使用)
そして、スクリプトはファイルを変更してリモートにプッシュするために、右のフォルダにcdにする必要があります。その後、cdが最初の作業ツリー/ブランチに戻ります。

+0

うわー、これは本当に私が(リンクのちょっとしたレビューから)探している答えだろう。残念ながら、当社製品が展開されているLinuxシステムでは、CentOS 7(RHEL 7)が稼動しています。このLinux用のgitの利用可能なバージョンは1.8.3.1です:2.5とははるかに似ています。 CentOSは安定していますが、その安定性は通常、悲しいほど古いものです**(私の意見)。それでも、ありがとう。おそらく私はシステムをgitのこのバージョンにアップデートする必要があると思っている人たちを説得することができます。 –

+0

@AndrewFalanga必要に応じていつでもアップグレードすることができます:問題なくgitコンパイルします。 – VonC

関連する問題