Portsmouth match-winner Crouch celebrates his opener at Ashton Gate
Peter Crouch and Niko Kranjcar got the goals that settled a pulsating replay and ensured FA Cup holders Portsmouth avoided a third-round exit.
Crouch slid home Armand Traore's cross in the first half before Kranjcar made it 2-0 on the counter late on, but that barely tells the story of a superb tie.
Bristol City produced a great display, only to find David James in fine form.
Marvin Elliott and Nicky Maynard both tested him, before the latter saw his last-minute penalty palmed away.
It was a cruel end to the match for City, who had refused to be overawed by their Premier League opponents, even if it is hard to argue that Portsmouth - who next face Histon's conquerors Swansea - did not deserve to win.
The form book suggested an upset could be on the cards, with Portsmouth on a run of one win in eight matches and City unbeaten in three - and the Championship outfit flew out of the blocks from the first whistle.
The likes of Ivan Sproule and Elliott caused plenty of problems, not least when Elliott forced a superb save from James with a great close-range header, while Portsmouth's back three were barely given a moment's rest by Maynard.
However, Portsmouth always looked dangerous on the break and after Traore had tested City keeper Adriano Basso from long range early on, the visitors hit the post twice in a minute - first from David Nugent's prodded effort and then Traore's deflected shot.
The hosts' relief was short-lived, however, as Crouch finished off a brilliant counter-attacking move involving Nadir Belhadj and Traore moments later to give Portsmouth the lead.
The strike was not without controversy, though, with TV replays suggesting Crouch handled the ball in his own box at the start of the move, but official Mike Jones did not give it and the goal stood.
Still, City will have been happy enough with their first-half display and the second followed much the same pattern - the hosts dominating possession and Pompey threatening on the break.
Crouch could have made it 2-0 when he was put through by Younes Kaboul's flick-on from James's punt but he fluffed it wide with just the keeper to beat, while at the other end Johnson twice had to provide saving tackles to deny first Elliott and then Maynard.
It was all set up for a grandstand finish but, aside from a Maynard turn and shot that was well saved and a Lee Johnson header wide, City could not make the most of an increasingly fragile Portsmouth defence.
In fact, after Belhadj had forced a cracking save from Basso with an 18-yard strike, it was the full-back who set up Pompey's second of the night, Kranjcar latching onto his square pass and poking into an open net from close range.
Frustratingly, it was then that City carved out their best chance of the night after Sol Campbell had scythed down Maynard in the box, but the striker saw his spot-kick brilliantly turned away.
It was not to be the hosts' night and Portsmouth held on for what was their first ever win over Bristol City at the 10th time of asking.
Bristol City manager Gary Johnson:
"The result is 2-0 so you can't say too much. I thought we gave it a right go and left ourselves open a bit as we tried to get the equaliser.
"But we made James make a couple of decent saves.
"(As for whether it was handball on the first goal) that's for the viewers to decide. I don't want to moan about the officials. It's a football match - those things happen.
"I have to pick them up now. We'll show them the highlights and they'll see they are very much involved."
Portsmouth boss Tony Adams:
"I'm delighted - we're in the next round and that's job done.
"We showed our quality on the counter attack tonight and also our resilience. I would have been gutted if that penalty at the end had gone in because I wanted the clean sheet.
"We have set our stall out of late to keep clean sheets and be resilient - and we were."
This page is best viewed in an up-to-date web browser with style sheets (CSS) enabled. While you will be able to view the content of this page in your current browser, you will not be able to get the full visual experience. Please consider upgrading your browser software or enabling style sheets (CSS) if you are able to do so.